Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.csd.uwm.edu!gem.mps.ohio-state.edu!ginosko!ctrsol!cica!iuvax!rutgers!bellcore!att!dptg!ulysses!andante!alice!andrew From: andrew@alice.UUCP (Andrew Hume) Newsgroups: comp.lang.c Subject: Re: random numbers Summary: try this Message-ID: <9849@alice.UUCP> Date: 30 Aug 89 04:34:46 GMT References: <876.24EFA953@busker.FIDONET.ORG> <1094@gara.une.oz> Organization: AT&T Bell Laboratories, Murray Hill NJ Lines: 60 if you can tolerate a congruential style generator, try this: /* random number generator from cacm 31 10, oct 88 for 32 bit integers (called long here) */ #ifdef MAIN #define A 16807 /* good numbers */ #define M 2147483647 #define Q 127773 #define R 2836 #else #define A 48271 /* better numbers */ #define M 2147483647 #define Q 44488 #define R 3399 #endif static long seed; srand(unsigned newseed) { seed = newseed; } rand() { long lo, hi, test; hi = seed/Q; lo = seed%Q; test = A*lo - R*hi; if(test > 0) seed = test; else seed = test+M; return(seed); } #ifdef MAIN main() { int i; srand(1); for(i = 0; i < 10000; i++) rand(); if(seed == 1043618065) printf("implementation looks correct\n"); else printf("uh oh! seed=%u, should be 1043618065\n", seed); exit(0); } #endif compile with -DMAIN to test.