equal
deleted
inserted
replaced
|
1 /*** This is a portable random number generator whose origins are |
|
2 *** unknown. As far as can be told, this is public domain software. |
|
3 |
|
4 |
|
5 /*** portable random number generator */ |
|
6 |
|
7 /*** Note that every variable used here must have at least 31 bits |
|
8 *** of precision, exclusive of sign. Long integers should be enough. |
|
9 *** The generator is the congruential: i = 7**5 * i mod (2^31-1). |
|
10 ***/ |
|
11 |
|
12 #define MULTIPLIER 16807 |
|
13 #define MODULUS 2147483647 |
|
14 |
|
15 static long saved_seed; |
|
16 |
|
17 |
|
18 /*** set_random - initialize constants and seed */ |
|
19 |
|
20 void set_random(seed) |
|
21 long seed; |
|
22 { |
|
23 saved_seed = seed; |
|
24 } |
|
25 |
|
26 |
|
27 /*** ng_random - generate a random integer in the interval [a,b] (b >= a >= 0) */ |
|
28 |
|
29 long ng_random(a, b) |
|
30 long a, b; |
|
31 { |
|
32 register long hi, lo; |
|
33 |
|
34 hi = MULTIPLIER * (saved_seed >> 16); |
|
35 lo = MULTIPLIER * (saved_seed & 0xffff); |
|
36 hi += (lo>>16); |
|
37 lo &= 0xffff; |
|
38 lo += (hi>>15); |
|
39 hi &= 0x7fff; |
|
40 lo -= MODULUS; |
|
41 if ((saved_seed = (hi<<16) + lo) < 0) |
|
42 saved_seed += MODULUS; |
|
43 |
|
44 if (b <= a) |
|
45 return b; |
|
46 return a + saved_seed % (b - a + 1); |
|
47 } |