1 #ifndef RANDOMIZER
2 #define RANDOMIZER
3
4 #include <time.h>
5
6 // This class implements the Mersenne Twister pseudo random generator.
7 // That fuckin crap of drand48() costed us hours of debugging! Shall
8 // its developers be eaten by the Ravenous Bugblatter Beast of Traal!
9
10 // The algorithm comes from Wikipedia:
11 // http://en.wikipedia.org/wiki/Mersenne_twister
12
13 class Randomizer
14 {
15 private:
16 unsigned int MT[624];
17 int cycle;
18
19 // Generates a new array of numbers
20 void generate()
21 {
22 int y;
23
24 for (int i = 0; i <= 622; ++i)
25 {
26 y = (0x80000000 & MT[i]) | (0x7FFFFFFF & MT[i + 1]);
27
28 if (0x1 & y)
29 MT[i] = MT[(i + 397) % 624] ^ (y >> 1) ^ 0x9908B0DF;
30 else
31 MT[i] = MT[(i + 397) % 624] ^ (y >> 1);
32 }
33
34 y = (0x80000000 & MT[623]) | (0x7FFFFFFF & MT[0]);
35 if (0x1 & y)
36 MT[623] = MT[396] ^ (y >> 1) ^ 0x9908B0DF;
37 else
38 MT[623] = MT[396] ^ (y >> 1);
39
40 cycle = 0;
41 };
42
43 public:
44 Randomizer()
45 : cycle(0)
46 {
47 seed(time(NULL));
48 generate();
49 };
50
51 Randomizer(int seed)
52 : cycle(0)
53 {
54 this->seed(seed);
55 generate();
56 };
57
58 void seed(int seed)
59 {
60 MT[0] = seed;
61
62 for (int i = 1; i <= 623; ++i)
63 {
64 // Important: We need exactly the last 32 bits
65 // (Automatically the case for 32 bit systems)
66 MT[i] = (69069 * MT[i - 1]) + 1;
67 }
68 };
69
70 // Returns uniformly distributed integers in [0..2^32)
71 unsigned int rand()
72 {
73 if (cycle > 623)
74 generate();
75
76 int y = MT[cycle++];
77
78 y = y ^ (y >> 11);
79 y = y ^ (y << 7 ) & 0x9D2C5680;
80 y = y ^ (y << 15) & 0xEFC60000;
81 y = y ^ (y >> 18);
82 return y;
83 };
84
85 // Returns uniformly distributed doubles in [0.0..1.0)
86 double drand()
87 {
88 double result = rand();
89 return result / pow(2.0,31.0);
90 };
91 };
92
93 #endif
syntax highlighted by Code2HTML, v. 0.9.1