67 #if UINT_MAX < 4294967295U
70 typedef unsigned int twist_int;
75 #if defined(BZ_HAVE_NAMESPACES) && defined(BZ_HAVE_STD)
76 typedef std::vector<twist_int>
State;
78 typedef vector<twist_int>
State;
81 typedef State::iterator
Iter;
84 enum { K = 0x9908b0df };
86 inline twist_int
low_mask (twist_int s1)
const {
87 return (s1&1u) ? K : 0u;
90 return ((s0&0x80000000)|(s1&0x7fffffff))>>1;
92 inline twist_int operator() (twist_int s1) {
93 twist_int
r = high_mask(s1) ^ low_mask(s1);
100 enum { N = 624, PF = 397, reference_seed = 4357 };
128 MersenneTwister(twist_int initial_seed)
134 void seed (twist_int seed = reference_seed)
138 seed = reference_seed;
140 enum { Knuth_A = 69069 };
141 twist_int x = seed & 0xFFFFFFFF;
143 twist_int mask = (seed == reference_seed) ? 0 : 0xFFFFFFFF;
144 for (
int j = 0;
j < N; ++
j) {
147 *s++ = (x + (mask &
j)) & 0xFFFFFFFF;
164 for (Iter pf_end = S.begin()+(N-PF); p0 != pf_end; ++p0, ++pM)
165 *p0 = *pM ^ twist (p0[1]);
167 for (Iter s_end = S.begin()+(N-1); p0 != s_end; ++p0, ++pM)
168 *p0 = *pM ^ twist (p0[1]);
169 *p0 = *pM ^ twist (S[0]);
174 inline twist_int random (
void)
176 if (I >= S.end()) reload();
179 y ^= (y << 7) & 0x9D2C5680;
180 y ^= (y << 15) & 0xEFC60000;
187 friend class MersenneTwister;
195 std::istringstream is(s);
197 S =
State(std::istream_iterator<twist_int>(is),
198 std::istream_iterator<twist_int>());
201 operator bool()
const {
return !
S.empty(); }
204 return std::string();
205 std::ostringstream os;
207 std::copy(
S.begin(),
S.end(),
208 std::ostream_iterator<twist_int>(os,
" "));
216 T_state tmp(
S,
I-
S.begin());
221 std::cerr <<
"Error: state is empty" << std::endl;