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