62 #define N (624) // length of state vector
63 #define M (397) // a period parameter
64 #define K (0x9908B0DFU) // a magic constant
65 #define hiBit(u) ((u) & 0x80000000U) // mask all but highest bit of u
66 #define loBit(u) ((u) & 0x00000001U) // mask all but lowest bit of u
67 #define loBits(u) ((u) & 0x7FFFFFFFU) // mask the highest bit of u
68 #define mixBits(u, v) (hiBit(u)|loBits(v)) // move hi bit of u to hi bit of v
74 using namespace SLNet;
76 void seedMT(
unsigned int seed,
unsigned int *state,
unsigned int *&next,
int &left );
77 unsigned int reloadMT(
unsigned int *state,
unsigned int *&next,
int &left );
78 unsigned int randomMT(
unsigned int *state,
unsigned int *&next,
int &left );
79 void fillBufferMT(
void *buffer,
unsigned int bytes,
unsigned int *state,
unsigned int *&next,
int &left );
80 float frandomMT(
unsigned int *state,
unsigned int *&next,
int &left );
104 void seedMT(
unsigned int seed,
unsigned int *state,
unsigned int *&next,
int &left )
154 unsigned int x = ( seed | 1U ) & 0xFFFFFFFFU, *s = state;
157 for ( left = 0, *s++ = x, j =
N; --j;
158 *s++ = ( x *= 69069U ) & 0xFFFFFFFFU )
164 unsigned int reloadMT(
unsigned int *state,
unsigned int *&next,
int &left )
166 unsigned int * p0 = state, *p2 = state + 2, *pM = state +
M, s0, s1;
172 left =
N - 1, next = state + 1;
174 for ( s0 = state[ 0 ], s1 = state[ 1 ], j =
N - M + 1; --j; s0 = s1, s1 = *p2++ )
175 * p0++ = *pM++ ^ (
mixBits( s0, s1 ) >> 1 ) ^ (
loBit( s1 ) ?
K : 0U );
177 for ( pM = state, j = M; --j; s0 = s1, s1 = *p2++ )
178 * p0++ = *pM++ ^ (
mixBits( s0, s1 ) >> 1 ) ^ (
loBit( s1 ) ?
K : 0U );
180 s1 = state[ 0 ], *p0 = *pM ^ (
mixBits( s0, s1 ) >> 1 ) ^ (
loBit( s1 ) ?
K : 0U );
184 s1 ^= ( s1 << 7 ) & 0x9D2C5680U;
186 s1 ^= ( s1 << 15 ) & 0xEFC60000U;
188 return ( s1 ^ ( s1 >> 18 ) );
192 unsigned int randomMT(
unsigned int *state,
unsigned int *&next,
int &left )
197 return (
reloadMT(state, next, left) );
203 y ^= ( y << 7 ) & 0x9D2C5680U;
205 y ^= ( y << 15 ) & 0xEFC60000U;
207 return ( y ^ ( y >> 18 ) );
213 void fillBufferMT(
void *buffer,
unsigned int bytes,
unsigned int *state,
unsigned int *&next,
int &left )
215 unsigned int offset=0;
217 while (bytes-offset>=
sizeof(r))
220 memcpy((
char*)buffer+offset, &r,
sizeof(r));
225 memcpy((
char*)buffer+offset, &r, bytes-offset);
228 float frandomMT(
unsigned int *state,
unsigned int *&next,
int &left )
230 return (
float ) ( ( double )
randomMT(state, next, left) / 4294967296.0 );