generators/netgen/random.c
changeset 6 a3ef33a8694a
     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 +}