60 typedef vector<twist_int>
State;
61 typedef State::iterator
Iter;
64 enum { K = 0x9908b0df };
66 inline friend twist_int
low_mask (twist_int s1) {
67 return (s1&1u) ? K : 0u;
70 return ((s0&0x80000000)|(s1&0x7fffffff))>>1;
72 inline twist_int operator() (twist_int s1) {
73 twist_int
r = high_mask(s1) ^ low_mask(s1);
80 enum { N = 624, PF = 397, reference_seed = 4357 };
85 void seed (twist_int seed = reference_seed)
87 if (!S.size()) S.resize(N);
88 enum { Knuth_A = 69069 };
89 twist_int x = seed & 0xFFFFFFFF;
91 twist_int mask = (seed == reference_seed) ? 0 : 0xFFFFFFFF;
92 for (
int j = 0;
j < N; ++
j) {
95 *s++ = (x + (mask &
j)) & 0xFFFFFFFF;
103 if (!S.size()) seed ();
109 for (Iter pf_end = S.begin()+(N-PF); p0 != pf_end; ++p0, ++pM)
110 *p0 = *pM ^ twist (p0[1]);
112 for (Iter s_end = S.begin()+(N-1); p0 != s_end; ++p0, ++pM)
113 *p0 = *pM ^ twist (p0[1]);
114 *p0 = *pM ^ twist (S[0]);
119 inline twist_int random (
void)
121 if (I >= S.end()) reload();
124 y ^= (y << 7) & 0x9D2C5680;
125 y ^= (y << 15) & 0xEFC60000;
144 f = (1.0 / 65536) / 65536;
157 return ((y1 *
f) * y2 * f);