]> pd.if.org Git - jsw/blob - jsw_rand.c
initial commit of data structure code from jsw
[jsw] / jsw_rand.c
1 #include <limits.h>\r
2 #include <time.h>\r
3 #include "jsw_rand.h"\r
4 \r
5 #define N 624\r
6 #define M 397\r
7 #define A 0x9908b0dfUL\r
8 #define U 0x80000000UL\r
9 #define L 0x7fffffffUL\r
10 \r
11 /* Internal state */\r
12 static unsigned long x[N];\r
13 static int next;\r
14 \r
15 /* Initialize internal state */\r
16 void jsw_seed ( unsigned long s )\r
17 {\r
18   int i;\r
19 \r
20   x[0] = s & 0xffffffffUL;\r
21 \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
26   }\r
27 }\r
28 \r
29 /* Mersenne Twister */\r
30 unsigned long jsw_rand ( void )\r
31 {\r
32   unsigned long y, a;\r
33   int i;\r
34 \r
35   /* Refill x if exhausted */\r
36   if ( next == N ) {\r
37     next = 0;\r
38 \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
43     }\r
44 \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
48   }\r
49 \r
50   y = x[next++];\r
51 \r
52   /* Improve distribution */\r
53   y ^= (y >> 11);\r
54   y ^= (y << 7) & 0x9d2c5680UL;\r
55   y ^= (y << 15) & 0xefc60000UL;\r
56   y ^= (y >> 18);\r
57 \r
58   return y;\r
59 }\r
60 \r
61 /* Portable time seed */\r
62 unsigned jsw_time_seed()\r
63 {\r
64   time_t now = time ( 0 );\r
65   unsigned char *p = (unsigned char *)&now;\r
66   unsigned seed = 0;\r
67   size_t i;\r
68 \r
69   for ( i = 0; i < sizeof now; i++ )\r
70     seed = seed * ( UCHAR_MAX + 2U ) + p[i];\r
71 \r
72   return seed;\r
73 }