Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | #include <stdio.h> |
2 | ||
3 | #define N 25 | |
4 | #define M 7 | |
5 | ||
6 | unsigned int rand(); /* returns a random integer */ | |
7 | void init( unsigned int ); /* initialize the generator */ | |
8 | ||
9 | ||
10 | /* return a random float >= 0 and < 1 */ | |
11 | #define rand_float ((double)rand() / 4294967296.0) | |
12 | ||
13 | ||
14 | static unsigned int x[N]; /* the 25 seeds */ | |
15 | ||
16 | static unsigned int mag01[2]; | |
17 | static int randk; | |
18 | void setpgSeed( unsigned int seed ) | |
19 | { | |
20 | int k; | |
21 | ||
22 | x[0] = (seed|1) & 0xffffffff; | |
23 | for (k=1; k<N; k++) | |
24 | x[k] = (69069 * x[k-1]) & 0xffffffff; | |
25 | mag01[0]= 0x0; | |
26 | mag01[1]= 0x8ebfd028; /* "magic" vector */ | |
27 | randk = 0; | |
28 | } | |
29 | ||
30 | ||
31 | unsigned int pgrand() | |
32 | { | |
33 | unsigned int y; | |
34 | unsigned int retval; | |
35 | int kk; | |
36 | ||
37 | ||
38 | if (randk==N) | |
39 | { | |
40 | for (kk=0; kk < N-M; kk++) | |
41 | x[kk] = x[kk+M] ^ (x[kk] >> 1) ^ mag01[x[kk] & 1]; | |
42 | ||
43 | for (; kk < N; kk++) | |
44 | x[kk] = x[kk+(M-N)] ^ (x[kk] >> 1) ^ mag01[x[kk] & 1]; | |
45 | ||
46 | randk=0; | |
47 | } | |
48 | y = x[randk++]; | |
49 | y ^= (y << 7) & 0x2b5b2500; | |
50 | y ^= (y << 15) & 0xdb8b0000; | |
51 | y &= 0xffffffff; /* you may delete this line if word size = 32 */ | |
52 | y ^= (y >> 16); | |
53 | ||
54 | retval = y; | |
55 | return (retval); | |
56 | } | |
57 |