DEFINITION MODULE Randoms;
(*******************************************************************
Module Randoms (Version 1.0)
Copyright (c) 1998-2006 by Andreas Fischlin and ETH Zurich.
Purpose Implements a multiplicative linear congruential
random number generator.
Remarks z(k+1) = A*z(k) MOD M
Multiplier A as well as modulus M are nonnegative
integers. A and M should satisfy in minimum these
conditions: A and M should be relatively prime, M should
be an odd prime, and A should be a primitive root of M.
These criteria warrant full period M.
M = 2**31 - 1 = 2147483647 = MAX(LONGINT)
A = 950'706'376 default multiplier
Above value of A is according to Fishman & Moore (1984)
the best there is for this type of random number
generator with maximum modulus M (for 32 bit integer
arithmetic) and warranted full period. The author's
exhaustive analysis of the statistical properties of this
generator have resulted in other possible multipliers,
having been ranked as the best 5, however, according to
the authors of slightly lesser random quality than A =
950706376. The 5 best are
A
-------------
950'706'376 The very "best" of the 5 best
742'938'285
1'226'874'159
62'089'911
1'343'714'438 The least "best" of the 5 best
-------------
out of 534 Million candidates for A! A first empirical
selection criterion has still left 414 top candidates,
out of which above 5 have excelled.
Implementation restriction: This module does not allow
for changing the modulus M, which should be of little
concern, since M = MAX(LONGINT) warrants the largest
possible period for 32 bit integer arithmetics.
References:
G. Fishman & L.R. Moore III, 1982. A statistical
evaluation of multiplicative congruential random
number generators with modulus 2^31-1. J. Amer.
Statist. Assoc., 77: 129ff.
G. Fishman & L.R. Moore III, 1984. An exhaustive
¤ analysis of multiplicative congruential ranom
number generators with modulus 2**31 -1.
Technical report UNC/ORSA/TR-84/5,44pp.
Programming
o Design
Andreas Fischlin 22/02/1998
o Implementation
Andreas Fischlin 22/02/1998
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: 25/02/1998 AF
*******************************************************************)
PROCEDURE SetMultiplier(multiplierA: LONGINT);
(* See remarks above *)
PROCEDURE Seed(z0: LONGINT); (*default z0 = 1*)
PROCEDURE GetZ(VAR curz: LONGINT);
(* Returns last z, e.g. for reseeding U in subsequent simulations *)
PROCEDURE U(): REAL;
(* returns within (0,1] uniformly distributed variates *)
END Randoms.