|
|
|
|
||
|
DEFINITION MODULE RandGen; (******************************************************************* Module RandGen (Version 1.0) Copyright (c) 1988-2006 by Andreas Fischlin and ETH Zurich. Purpose Basic pseudo-random number generator producing uniformly distributed variates within interval (0,1). Remarks The generator is based on a combination of three multiplicative linear congruential random number generators. It is highly portable and produces very-long-cycle random-number sequences. They exceed the usual period length of MAX(INTEGER) given by the machine dependent word length. Thus the generator produces satisfactory results even on a personal computer with a small word length (e.g. 16-Bit machines) and it is efficient, since it does not require double precision arithmetics. On 32-Bit machines like IBM main-frames or the Apple¨ Macintoshª PC this means that the slow 64-Bit multiplication and division can be avoided. The cycle length of the generator is estimated to be > 2.78 E13 so that the sequence will not repeat for over 220 years in case that 1000 variates were calculated per second (Wichmann & Hill, 1987) References: Wichmann, B.A. & Hill, I.D., 1982. An efficient and portable pseudo-random number generator. Algorithm AS 183. Applied Statistics, 31(2): 188-190. Wichmann, B. & Hill, D., 1987. Building a random-number generator. A Pascal routine for very-long-cycle random-number sequences. Byte 1987(March): 127-28. Programming o Design Andreas Fischlin 21/12/1988 o Implementation Andreas Fischlin 21/12/1988 ETH Zurich Systems Ecology CHN E 35.1 Universitaetstrasse 16 8092 Zurich SWITZERLAND URLs: <mailto:RAMSES@env.ethz.ch> <http://www.sysecol.ethz.ch> <http://www.sysecol.ethz.ch/SimSoftware/RAMSES> Last revision of definition: 31/08/1989 AF *******************************************************************) PROCEDURE SetSeeds(z0,z1,z2: INTEGER); (*defaults: z0 = 1, z1 = 10000, z2 = 3000 *) PROCEDURE GetSeeds(VAR z0,z1,z2: INTEGER); PROCEDURE Randomize; (*set seeds using seed values depending on a particular, unique and non repeatable event in real time, e.g. date and time of the clock. Implies a call to SetSeeds*) PROCEDURE ResetSeeds; (*reset seeds to values defined by last call to SetSeeds*) PROCEDURE U(): REAL; (*returns within (0,1) uniformly distributed variates*) (* Based on a combination of three multiplicative linear congruential random number generators of the form z(k+1) = A*z(k) MOD M with a prime modulus and a primitive root multiplier (=> individual generator full length period). The multipliers A are: 171, 172, and 170; the modulus' M are: 30269, 30307, and 30323. *) END RandGen.
|
||
|
|
|