22.1 Random Number Generation

The RNG class contains an implementation of the combined multiple recursive generator MRG32k3a proposed by L'Ecuyer [14]. The C++ code was adapted from [16]. This replaces the previous implementation of RNG, which used the minimal standard multiplicative linear congruential generator of Park and Miller [23]. The newer (MRG32k3a) RNG is used in ns versions 2.1b9 and later.

The MRG32k3a generator provides x independent streams of random numbers, each of which consists of x substreams. Each substream has a period (i.e., the number of random numbers before overlap) of x. The period of the entire generator is x. Figure 22.1 provides a graphical idea of how the streams and substreams fit together.

Figure 22.1: Overall arrangement of streams and substreams. [16]
[angle=270,width=6 in]figures/rng-streams.eps

A default RNG (defaultRNG), created at simulator initialization time, is provided. If multiple random variables are used in a simulation, each random variable should use a separate RNG object. When a new RNG object is created, it is automatically seeded to the beginning of the next independent stream of random numbers. Used in this manner, the implementation allows for a maximum of x random variables.

Often, multiple independent replications of a simulation are needed (i.e., to perform statistical analysis given multiple runs with fixed parameters). For each replication, a different substream should be used to ensure that the random number streams are independent. (This process is given as an OTcl example later.) This implementation allows for a maximum of x independent replications. Each random variable in a single replication can produce up to x random numbers before overlapping.

Note: Only the most common functions are described here. For more information, see [16] and the source code found in tools/rng.h and tools/rng.cc. For a comparison of this RNG to the more common LCG16807 RNG (and why LCG16807 is not a good RNG), see [15].


Subsections
Paul Kroon 2008-03-16