3 /* PRNG based on Mersenne Twister (M. Matsumoto and T. Nishimura, 1998). */
5 #define MASK_U 0x80000000U
6 #define MASK_L 0x7fffffffU
7 #define MASK32 0xffffffffU
10 ini_rand( unsigned int u )
14 rand_work.count = RAND_N;
15 rand_work.cnst[0] = 0;
16 rand_work.cnst[1] = 0x9908b0dfU;
20 for ( i = 1; i < RAND_N; i++ )
22 u = i + 1812433253U * ( u ^ ( u >> 30 ) );
32 unsigned int u, u0, u1, u2;
35 if ( rand_work.count == RAND_N )
39 for ( i = 0; i < RAND_N-RAND_M; i++ )
41 u = rand_work.vec[i] & MASK_U;
42 u |= rand_work.vec[i+1] & MASK_L;
44 u0 = rand_work.vec[ i + RAND_M ];
46 u2 = rand_work.cnst[ u & 1 ];
48 rand_work.vec[i] = u0 ^ u1 ^ u2;
51 for ( ; i < RAND_N-1 ;i++ )
53 u = rand_work.vec[i] & MASK_U;
54 u |= rand_work.vec[i+1] & MASK_L;
56 u0 = rand_work.vec[ i + RAND_M - RAND_N ];
58 u2 = rand_work.cnst[ u & 1 ];
60 rand_work.vec[i] = u0 ^ u1 ^ u2;
63 u = rand_work.vec[RAND_N-1] & MASK_U;
64 u |= rand_work.vec[0] & MASK_L;
66 u0 = rand_work.vec[ RAND_M - 1 ];
68 u2 = rand_work.cnst[ u & 1 ];
70 rand_work.vec[RAND_N-1] = u0 ^ u1 ^ u2;
73 u = rand_work.vec[ rand_work.count++ ];
75 u ^= ( u << 7 ) & 0x9d2c5680U;
76 u ^= ( u << 15 ) & 0xefc60000U;
86 uint64_t h = rand32();
87 uint64_t l = rand32();
89 return l | ( h << 32 );