See: Description
| Interface | Description |
|---|---|
| CloneableRandomStream | |
| RandomStream |
This interface defines the basic structures to handle multiple streams
of uniform (pseudo)random numbers and convenient
tools to move around within and across these streams.
|
| RandomStreamFactory |
Represents a random stream factory capable
of constructing instances of a given type of random stream
by invoking the
newInstance method
each time a new random stream is needed, instead of invoking
directly the specific constructor of the desired type. |
| Class | Description |
|---|---|
| AntitheticStream |
This container class allows the user to force any
RandomStream to
return antithetic variates. |
| BakerTransformedStream |
This container class permits one to apply the baker's transformation to
the output of any
RandomStream. |
| BasicRandomStreamFactory |
Represents a basic random stream factory that can constructs new
instances of a given
RandomStream implementation via the
newInstance method. |
| F2NL607 |
Implements the
RandomStream interface by using as a backbone
generator the combination of the WELL607 proposed in
(and implemented in WELL607) with a nonlinear generator. |
| GenF2w32 |
Implements the
RandomStream interface via inheritance
from RandomStreamBase. |
| LFSR113 |
Extends
RandomStreamBase using a composite linear feedback
shift register (LFSR) (or Tausworthe) RNG as defined in. |
| LFSR258 |
Extends
RandomStreamBase using a 64-bit composite linear feedback
shift register (LFSR) (or Tausworthe) RNG as defined in. |
| MRG31k3p |
Extends the abstract class
RandomStreamBase, thus
implementing the RandomStream interface indirectly. |
| MRG32k3a |
Extends the abstract class
RandomStreamBase by using as a
backbone (or main) generator the combined multiple recursive
generator (CMRG) MRG32k3a proposed by L'Ecuyer,
implemented in 64-bit floating-point arithmetic. |
| MRG32k3aL |
The same generator as
MRG32k3a, except here it is implemented
with type long instead of double. |
| MT19937 |
Implements the
RandomStream interface via inheritance from
RandomStreamBase. |
| RandMrg | Deprecated |
| RandomPermutation |
Provides methods to randomly shuffle arrays
or lists using a random stream.
|
| RandomStreamBase |
This class provides a convenient foundation on which RNGs can
be built.
|
| RandomStreamManager |
Manages a list of random streams for more convenient synchronization.
|
| RandomStreamWithCache |
This class represents a random stream whose uniforms
are cached for more efficiency when using
common random numbers.
|
| RandRijndael |
Implements a RNG using the Rijndael block cipher algorithm
(AES) with key and block lengths of 128 bits.
|
| TruncatedRandomStream |
Represents a container random stream generating numbers in an interval
(a, b) instead of in (0, 1), where
0 <= a < b <= 1,
by using the contained stream.
|
| WELL1024 |
Implements the
RandomStream interface via inheritance from
RandomStreamBase. |
| WELL512 |
This class implements the
RandomStream interface via inheritance from
RandomStreamBase. |
| WELL607 |
This class implements the
RandomStream interface via inheritance
from RandomStreamBase. |
| Exception | Description |
|---|---|
| RandomStreamInstantiationException |
This exception is thrown when a random stream factory cannot instantiate a stream
on a call to its
newInstance method. |
Each implementation uses a specific backbone uniform random number generator (RNG), whose period length is typically partitioned into very long non-overlapping segments to provide the streams and substreams. A stream can generate uniform variates (real numbers) over the interval (0,1), uniform integers over a given range of values {i,..., j}, and arrays of these.
The generators provided here have various speeds and period lengths. umontreal.iro.lecuyer.rngMRG32k3a is the one that has been most extensively tested, but it is not among the fastest. The umontreal.iro.lecuyer.rngLFSR113, umontreal.iro.lecuyer.rngGenF2w32, umontreal.iro.lecuyer.rngMT19937, and the WELL generators produce sequences of bits that obey a linear recurrence, so they eventually fail statistical tests that measure the linear complexity of these bits sequences. But this can affect only very special types of applications.
For each generator, the following tables give the approximate period length (period), the CPU time (in seconds) to generate 109 U(0, 1) random numbers (gen. time), and the CPU time to jump ahead 106 times to the next substream (jump time). The following timings are on a 2100 MHz 32-bit AMD Athlon XP 2800+ computer running Linux, with the JDK 1.4.2.
| RNG | period | gen. time | jump time |
| LFSR113 | 2113 | 51 | 0.08 |
| WELL512 | 2512 | 55 | 372 |
| WELL1024 | 21024 | 55 | 1450 |
| MT19937 | 219937 | 56 | 60 |
| WELL607 | 2607 | 61 | 523 |
| GenF2w32 | 2800 | 62 | 937 |
| MRG31k3p | 2185 | 66 | 1.8 |
| MRG32k3a | 2191 | 109 | 2.3 |
| F2NL607 | 2637 | 125 | 523 |
| RandRijndael | 2130 | 260 | 0.9 |
The following timings are on a 2400 MHz 64-bit AMD Athlon 64 Processor 4000+ computer running Linux, with the JDK 1.5.0.
| RNG | period | gen. time | jump time |
| LFSR113 | 2113 | 31 | 0.08 |
| WELL607 | 2607 | 33 | 329 |
| WELL512 | 2512 | 33 | 234 |
| WELL1024 | 21024 | 34 | 917 |
| LFSR258 | 2258 | 35 | 0.18 |
| MT19937 | 219937 | 36 | 46 |
| GenF2w32 | 2800 | 43 | 556 |
| MRG31k3p | 2185 | 51 | 0.89 |
| F2NL607 | 2637 | 65 | 329 |
| MRG32k3a | 2191 | 70 | 1.1 |
| RandRijndael | 2130 | 127 | 0.6 |
Other tools included in this package permit one to manage and synchronize several streams simultaneously (umontreal.iro.lecuyer.rngRandomStreamManager), to create random stream factories for a given type of stream (umontreal.iro.lecuyer.rngBasicRandomStreamFactory), and to apply automatic transformations to the output of a given stream (umontreal.iro.lecuyer.rngAntitheticStream and umontreal.iro.lecuyer.rngBakerTransformedStream).
For further details about uniform RNGs, we refer the reader to[#!rKNU98a!#,#!rLEC01d!#,#!rLEC04b!#].
Should add an example somewhere.
To submit a bug or ask questions, send an e-mail to Pierre L'Ecuyer.