[comp.lang.c] 35bits random generator

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)));
}