25 #ifndef BZ_RAND_TT800_H
26 #define BZ_RAND_TT800_H
39 TT800(
double low = 0.0,
double high = 1.0,
double = 0.0)
40 : low_(low), length_(high-low)
43 x[0] = 0x95f24dab; x[1] = 0x0b685215; x[2] = 0xe76ccae7;
44 x[3] = 0xaf3ec239; x[4] = 0x715fad23; x[5] = 0x24a590ad;
45 x[6] = 0x69e4b5ef; x[7] = 0xbf456141; x[8] = 0x96bc1b7b;
46 x[9] = 0xa7bdf825; x[10] = 0xc1de75b7; x[11] = 0x8858a9c9;
47 x[12] = 0x2da87693; x[13] = 0xb657f9dd; x[14] = 0xffdc8a9f;
48 x[15] = 0x8121da71; x[16] = 0x8b823ecb; x[17] = 0x885d05f5;
49 x[18] = 0x4e20cd47; x[19] = 0x5a9ad5d9; x[20] = 0x512c0c03;
50 x[21] = 0xea857ccd; x[22] = 0x4cc1d30f; x[23] = 0x8891a8a1;
55 mag01[1] = 0x8ebfd028;
61 f = (1.0 / 65536) / 65536;
69 unsigned long randomUint32()
74 unsigned long y = x[
k];
75 y ^= (y << 7) & 0x2b5b2500;
76 y ^= (y << 15) & 0xdb8b0000;
89 unsigned long y1 = randomUint32();
90 unsigned long y2 = randomUint32();
92 return low_ + length_ * ((y1 * f) * y2 * f);
100 for (kk=0;kk<N-M;kk++) {
101 x[kk] = x[kk+M] ^ (x[kk] >> 1) ^ mag01[x[kk] % 2];
104 x[kk] = x[kk+(M-N)] ^ (x[kk] >> 1) ^ mag01[x[kk] % 2];
110 enum { N = 25, M = 7 };
116 unsigned long mag01[2];
121 #endif // BZ_RAND_TT800_H