alpar@6: /*** This is a portable random number generator whose origins are alpar@6: *** unknown. As far as can be told, this is public domain software. alpar@6: alpar@6: alpar@6: /*** portable random number generator */ alpar@6: alpar@6: /*** Note that every variable used here must have at least 31 bits alpar@6: *** of precision, exclusive of sign. Long integers should be enough. alpar@6: *** The generator is the congruential: i = 7**5 * i mod (2^31-1). alpar@6: ***/ alpar@6: alpar@6: #define MULTIPLIER 16807 alpar@6: #define MODULUS 2147483647 alpar@6: alpar@6: static long saved_seed; alpar@6: alpar@6: alpar@6: /*** set_random - initialize constants and seed */ alpar@6: alpar@6: void set_random(seed) alpar@6: long seed; alpar@6: { alpar@6: saved_seed = seed; alpar@6: } alpar@6: alpar@6: alpar@6: /*** ng_random - generate a random integer in the interval [a,b] (b >= a >= 0) */ alpar@6: alpar@6: long ng_random(a, b) alpar@6: long a, b; alpar@6: { alpar@6: register long hi, lo; alpar@6: alpar@6: hi = MULTIPLIER * (saved_seed >> 16); alpar@6: lo = MULTIPLIER * (saved_seed & 0xffff); alpar@6: hi += (lo>>16); alpar@6: lo &= 0xffff; alpar@6: lo += (hi>>15); alpar@6: hi &= 0x7fff; alpar@6: lo -= MODULUS; alpar@6: if ((saved_seed = (hi<<16) + lo) < 0) alpar@6: saved_seed += MODULUS; alpar@6: alpar@6: if (b <= a) alpar@6: return b; alpar@6: return a + saved_seed % (b - a + 1); alpar@6: }