3 #include "jsw_rand.h"
\r
7 #define A 0x9908b0dfUL
\r
8 #define U 0x80000000UL
\r
9 #define L 0x7fffffffUL
\r
11 /* Internal state */
\r
12 static unsigned long x[N];
\r
15 /* Initialize internal state */
\r
16 void jsw_seed ( unsigned long s )
\r
20 x[0] = s & 0xffffffffUL;
\r
22 for ( i = 1; i < N; i++ ) {
\r
23 x[i] = ( 1812433253UL
\r
24 * ( x[i - 1] ^ ( x[i - 1] >> 30 ) ) + i );
\r
25 x[i] &= 0xffffffffUL;
\r
29 /* Mersenne Twister */
\r
30 unsigned long jsw_rand ( void )
\r
35 /* Refill x if exhausted */
\r
39 for ( i = 0; i < N - 1; i++ ) {
\r
40 y = ( x[i] & U ) | x[i + 1] & L;
\r
41 a = ( y & 0x1UL ) ? A : 0x0UL;
\r
42 x[i] = x[( i + M ) % N] ^ ( y >> 1 ) ^ a;
\r
45 y = ( x[N - 1] & U ) | x[0] & L;
\r
46 a = ( y & 0x1UL ) ? A : 0x0UL;
\r
47 x[N - 1] = x[M - 1] ^ ( y >> 1 ) ^ a;
\r
52 /* Improve distribution */
\r
54 y ^= (y << 7) & 0x9d2c5680UL;
\r
55 y ^= (y << 15) & 0xefc60000UL;
\r
61 /* Portable time seed */
\r
62 unsigned jsw_time_seed()
\r
64 time_t now = time ( 0 );
\r
65 unsigned char *p = (unsigned char *)&now;
\r
69 for ( i = 0; i < sizeof now; i++ )
\r
70 seed = seed * ( UCHAR_MAX + 2U ) + p[i];
\r