luong@grace.cs.washington.edu (Luong La) (02/09/89)
Many msgs were concerning with rand(), so here one of the rand35() I used. note: MSC5.1 had fmod function -> floatingpoint modulo #include <math.h> static double z35=0.00001; double rand35() { z35 = fmod(3125.0*z35,34359738340.0); return z35;} /* normalize -> [0,1] */ double nrand35() {return (rand35()/3435973839.0);} credits: I copied this generator from some where and I believed it calls <PRIME MODULUS MULTIPLICATIVE LINEAR CONGRUENT GENERATOR> ===RLab===Epsilon task takes infinite time=== luong@grace.cs.washington.edu
desnoyer@Apple.COM (Peter Desnoyers) (02/10/89)
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 <math.h> /*** 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))); }