25.1 Random Number Generation

The RNG class contains an implementation of the combined multiple
recursive generator MRG32k3a proposed by L'Ecuyer
[16]. The C++ code was adapted from [18].
This replaces the previous implementation of `RNG`, which used
the minimal standard multiplicative linear congruential generator of
Park and Miller [27]. 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 25.1 provides a graphical idea of how the streams and substreams fit together.

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 [18] 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 [17].