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 );