This is a Mersenne Twister pseudorandom number generator
with period 2^19937  1 with improved initialization scheme,
modified on 2002/1/26 by Takuji Nishimura and Makoto Matsumoto.
This version is a port from the original Ccode to C++ by
Jasper Bedaux (http://www.bedaux.net/mtrand/).
Contents of this tar ball:
mtreadme.txt this file
mtrand.h the include file containing class declarations
mtrand.cpp the library file containing noninline members
mttest.cpp small program to test the random number generators
mttest.out output of the test program to compare to if modified
1. Initialization
The initialization scheme for the previous versions of MT
(e.g. 1999/10/28 version or earlier) has a tiny problem, that
the most significant bits of the seed is not well reflected
to the state vector of MT.
This version (2002/1/26) has two initialization schemes:
seed(s) and seed(array, length).
seed(s) initializes the state vector by using
one unsigned 32bit integer 's', which may be zero.
seed(array, length) initializes the state vector
by using an array 'array' of unsigned 32bit integers
of length 'length'. If 'length' is smaller than 624,
then each array of 32bit integers gives a distinct initial
state vector. This is useful if you want a larger seed space
than a 32bit word.
2. Generators
Below is an overview of the generators (functor classes) available.
The last four are derived from the first one and all instances of every
generator use the same static state vector in computer memory, so
initialization must only be done once, when the first generator instance
is created.
MTRand_int32 generates unsigned 32bit integers.
MTRand generates uniform double precision floating point numbers
in the halfopen interval [0, 1) (32bit resolution).
MTRand_open generates uniform double precision floating point numbers
in the open interval (0, 1) (32bit resolution).
MTRand_closed generates uniform double precision floating point numbers
in the closed interval [0, 1] (32bit resolution).
MTRand53 generates uniform double precision floating point numbers
in the halfopen interval [0, 1) (53bit resolution).
3. Usage
Use #include "mtrand.h" in your C++ file and compile together with
mtrand.cpp, e.g. g++ yourprogram.cpp mtrand.cpp.
As an example, the usage of an MTRand object is given. The other classes
can be used in the same way.
unsigned long s = 89UL;
unsigned long array[] = {0x123, 0x234, 0x345, 0x456};
MTRand mt;
// construct random number generator, no initialization is done when
// some other instance already performed an initialization, else, a
// default seed number is used (not recommended)
// alternative:
MTRand mt(s);
// the generator is initialized with the number s
// alternative:
MTRand mt(array, 4);
// the generator is initialized with 'array' of length 4
// the initializations can also be done with:
mt.seed(s);
// or
mt.seed(array, 4);
// an MTRand object behaves like a generator, i.e., like a function
// that accepts no arguments and returns a pseudo random number,
// so to generate a random number use for example
unsigned long random_number;
random_number = mt();
4. Test program
A small program to test the random number generators is included as
mttest.cpp. It is an example to initialize with an array of length 4,
then output 1000 unsigned 32bit integers, then 1000 real [0,1) numbers.
5. The output
The output of mttest.cpp is in the file mttest.out.
If you revise or translate the code, check the output by using this file.
6. Cryptography
This generator is not cryptographically secure. You need to use a oneway
(or hash) function to obtain a secure random sequence.
7. Correspondence
See
URL: http://www.math.keio.ac.jp/matumoto/emt.html
email: matumoto@math.keio.ac.jp, nisimura@sci.kj.yamagatau.ac.jp
For correspondence about this C++ port see
http://www.bedaux.net/mtrand/ for contact information.
8. Reference
M. Matsumoto and T. Nishimura,
"Mersenne Twister: A 623Dimensionally Equidistributed Uniform
PseudoRandom Number Generator",
ACM Transactions on Modeling and Computer Simulation,
Vol. 8, No. 1, January 1998, pp 330.

Copyright (C) 1997  2002, Makoto Matsumoto and Takuji Nishimura,
All rights reserved.
