#ifndef H_CLCG4_H #define H_CLCG4_H #define Maxgen 100 /* Maximum number of generators, plus one. This value can be increased as needed. */ typedef unsigned short int Gen; /* A generator number, in the range 0 to Maxgen. */ typedef enum {InitialSeed, LastSeed, NewSeed} SeedType; void Init (long v, long w); /* Initializes the random number package. The values of V and W will be 2v and 2w, respectively. It is recommended that v * 30, w * 40, and v + w ^ 100. The initial seed is set by default to (11111111; 22222222; 33333333; 44444444). */ void SetInitialSeed (long s[4]); /* Set the initial seed I0 of generator number 0 (g = 0) to the integer values s[0],...,s[3]. Those values must satisfy: 1 ^ s[0] ^ 2147483646, 1 ^ s[1] ^ 2147483542, 1 ^ s[2] ^ 2147483422, 1 ^ s[3] ^ 2147483322. The initial seeds of all other generators are recomputed accordingly, so they are spaced V W values apart, and all generators are reinitialized to their initial seeds. */ void InitGenerator (Gen g, SeedType Where); /* Reinitialize the generator g. According to the value of Where, that generator's state Cg will be reset to the initial seed Ig (InitialSeed), or to the last seed Lg (LastSeed), which is at the beginning of the current segment, or to a new seed (NewSeed), W values ahead of the last seed in the generator's sequence. The last seed Lg is also reset to the same value as Cg. */ void SetSeed (Gen g, long s[4]); /* Set initial seed Ig of generator g to s[1],...,s[4]. Those values must satisfy: 1 ^ s[0] ^ 2147483646, 1 ^ s[1] ^ 2147483542, 1 ^ s[2] ^ 2147483422, 1 ^ s[3] ^ 2147483322. The current state Cg and last seed Lg are also put to that seed. */ void GetState (Gen g, long s[4]); /* Returns the current state Cg of generator g in s[0],...,s[3]. */ void WriteState (Gen g); /* Writes the current state Cg of generator g. */ double GenVal (Gen g); /* Returns a "uniform" random number over [0; 1], using generator g. The current state Cg is changed, but not Ig and Lg. */ void clcg_init (int seed); double GenVal_wrap (void); #endif