/* ------------------------------------------------------------------------- * This is an ANSI C library for multi-stream random number generation. * The use of this library is recommended as a replacement for the ANSI C * rand() and srand() functions, particularly in simulation applications * where the statistical 'goodness' of the random number generator is * important. The library supplies 256 streams of random numbers; use * SelectStream(s) to switch between streams indexed s = 0,1,...,255. * * The streams must be initialized. The recommended way to do this is by * using the function PlantSeeds(x) with the value of x used to initialize * the default stream and all other streams initialized automatically with * values dependent on the value of x. The following convention is used * to initialize the default stream: * if x > 0 then x is the state * if x < 0 then the state is obtained from the system clock * if x = 0 then the state is to be supplied interactively. * * The generator used in this library is a so-called 'Lehmer random number * generator' which returns a pseudo-random number uniformly distributed * 0.0 and 1.0. The period is (m - 1) where m = 2,147,483,647 and the * smallest and largest possible values are (1 / m) and 1 - (1 / m) * respectively. For more details see: * * "Random Number Generators: Good Ones Are Hard To Find" * Steve Park and Keith Miller * Communications of the ACM, October 1988 * * Name : rngs.c (Random Number Generation - Multiple Streams) * Authors : Steve Park & Dave Geyer * Language : ANSI C * Latest Revision : 09-22-98 * ------------------------------------------------------------------------- */ #include #include #include #include "rngs.h" #define MODULUS 2147483647 /* DON'T CHANGE THIS VALUE */ #define MULTIPLIER 48271 /* DON'T CHANGE THIS VALUE */ #define CHECK 399268537 /* DON'T CHANGE THIS VALUE */ #define STREAMS 256 /* # of streams, DON'T CHANGE THIS VALUE */ #define A256 22925 /* jump multiplier, DON'T CHANGE THIS VALUE */ #define DEFAULT 123456789 /* initial seed, use 0 < DEFAULT < MODULUS */ static long seed[STREAMS] = {DEFAULT}; /* current state of each stream */ static int stream = 0; /* stream index, 0 is the default */ static int initialized = 0; /* test for stream initialization */ float frand(float from, float to) { /* int r = random(); int q = r%(to-from); return (float)r-q*(to-from)+from; */ return (float)(((double)random()/RAND_MAX)*(to-from)+from); } int irand(int from, int to) { //srand(time(NULL)); return (int)(((double)random()/RAND_MAX)*(to-from+1)+from); } int signrand() { return irand(0, 1)*2-1; }