Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!bbn!apple!desnoyer From: desnoyer@Apple.COM (Peter Desnoyers) Newsgroups: comp.lang.c Subject: Re: 35bits random generator Message-ID: <25553@apple.Apple.COM> Date: 9 Feb 89 19:08:02 GMT References: <7217@june.cs.washington.edu> Organization: Apple Computer Inc, Cupertino, CA Lines: 61 If anyone needs a reliable random number generator, this is the generator used in SIMSCRIPT II. It is a linear congruential generator, and passes various tests for goodness. Just remember that you can use multiple seeds - NEVER do something like if (random(seed) < 0.00001) /* discrete time Poisson arrivals */ packet_size = (MAX_SIZE) * random(seed); /* same seed */ Use two different seeds instead. (Why is this bad? Why isn't mean(packet_size) equal to MAX_SIZE/2? These questions are left for the reader.) Peter Desnoyers --- code follows --- /***************************************************************************** * file: rnd.c * * description: implementation of random number generator used in * * SIMSCRIPT II. provides uniform and exponentially distributed * * numbers. * * Peter Desnoyers - 7/28/87 * *****************************************************************************/ /*** INCLUDES ***/ #include /*** DEFINES ***/ #define MODULUS 2147483647 /*** EXTERNALS ***/ extern double log(); /***************************************************************************** * function: random_u * * arguments: int * seed * * returns: double * * value: random number uniformly distributed over (0,1) * *****************************************************************************/ double random_u( seed) int * seed; { * seed = ((unsigned)(*seed * 1078318381)) % MODULUS; return ((double) *seed / MODULUS); } /***************************************************************************** * function: random_e * * arguments: int * seed * * returns: double * * value: exponentially distributed random variable with mean 1 * *****************************************************************************/ double random_e( seed) int * seed; { return (-1.0 * log( random_u( seed))); }