#include #include #include #include #define RNG_M 2147483647L /* m = 2^31 - 1 */ #define RNG_A 16807L #define RNG_Q 127773L /* m div a */ #define RNG_R 2836L /* m mod a */ /* 32 bit seed */ static long rnd_seed; void set_rnd_seed (long seedval) { /* set seed to value between 1 and m-1 */ rnd_seed = (seedval % (RNG_M - 1)) + 1; } /* returns a pseudo-random number from set 1, 2, ..., RNG_M - 1 */ long rnd() { register long low, high, test; set_rnd_seed( (unsigned int) time(0) + getpid()); high = rnd_seed / RNG_Q; low = rnd_seed % RNG_Q; test = RNG_A * low - RNG_R * high; if (test > 0) rnd_seed = test; else rnd_seed = test + RNG_M; return rnd_seed; } int main(void) { printf("Random number generated is %d\n", rnd()); return 0; }