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.edudesnoyer@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)));
}