1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/generators/netgen/random.c Fri Nov 26 19:23:47 2010 +0100
1.3 @@ -0,0 +1,47 @@
1.4 +/*** This is a portable random number generator whose origins are
1.5 + *** unknown. As far as can be told, this is public domain software.
1.6 +
1.7 +
1.8 +/*** portable random number generator */
1.9 +
1.10 +/*** Note that every variable used here must have at least 31 bits
1.11 + *** of precision, exclusive of sign. Long integers should be enough.
1.12 + *** The generator is the congruential: i = 7**5 * i mod (2^31-1).
1.13 + ***/
1.14 +
1.15 +#define MULTIPLIER 16807
1.16 +#define MODULUS 2147483647
1.17 +
1.18 +static long saved_seed;
1.19 +
1.20 +
1.21 +/*** set_random - initialize constants and seed */
1.22 +
1.23 +void set_random(seed)
1.24 +long seed;
1.25 +{
1.26 + saved_seed = seed;
1.27 +}
1.28 +
1.29 +
1.30 +/*** ng_random - generate a random integer in the interval [a,b] (b >= a >= 0) */
1.31 +
1.32 +long ng_random(a, b)
1.33 +long a, b;
1.34 +{
1.35 + register long hi, lo;
1.36 +
1.37 + hi = MULTIPLIER * (saved_seed >> 16);
1.38 + lo = MULTIPLIER * (saved_seed & 0xffff);
1.39 + hi += (lo>>16);
1.40 + lo &= 0xffff;
1.41 + lo += (hi>>15);
1.42 + hi &= 0x7fff;
1.43 + lo -= MODULUS;
1.44 + if ((saved_seed = (hi<<16) + lo) < 0)
1.45 + saved_seed += MODULUS;
1.46 +
1.47 + if (b <= a)
1.48 + return b;
1.49 + return a + saved_seed % (b - a + 1);
1.50 +}