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