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. 

Contents of this tar ball:
readme-mt.txt	 this file
mt19937ar.c	 the C source (ar: initialize by ARray)
mt19937ar.out	 Test outputs of six types generators. 1000 for each

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:
init_genrand(seed) and init_by_array(init_key, key_length).

init_genrand(seed) initializes the state vector by using
one unsigned 32-bit integer "seed", which may be zero.

init_by_array(init_key, key_length) initializes the state vector 
by using an array init_key[] of unsigned 32-bit integers
of length key_kength. If key_length is smaller than 624,
then each array of 32-bit integers gives distinct initial
state vector. This is useful if you want a larger seed space
than 32-bit word.

2. Generation
After initialization, the following type of pseudorandom numbers
are available. 

genrand_int32() generates unsigned 32-bit integers.
genrand_int31() generates unsigned 31-bit integers.
genrand_real1() generates uniform real in [0,1] (32-bit resolution). 
genrand_real2() generates uniform real in [0,1) (32-bit resolution). 
genrand_real3() generates uniform real in (0,1) (32-bit resolution).
genrand_res53() generates uniform real in [0,1) with 53-bit resolution.

Note: the last five functions call the first one. 
if you need more speed for these five functions, you may
suppress the function call by copying genrand_int32() and
replacing the last return(), following to these five functions.

3. main()
main() is an example to initialize with an array of length 4,
then 1000 outputs of unsigned 32-bit integers, 
then 1000 outputs of real [0,1) numbers. 

4. The outputs
The output of the mt19937ar.c is in the file mt19937ar.out.
If you revise or translate the code, check the output
by using this file. 

5. Cryptography
This generator is not cryptoraphically secure. 
You need to use a one-way (or hash) function to obtain 
a secure random sequence.

6. Correspondence
See:
URL http://www.math.keio.ac.jp/matumoto/emt.html
email matumoto@math.keio.ac.jp, nisimura@sci.kj.yamagata-u.ac.jp

7. Reference
M. Matsumoto and T. Nishimura,
"Mersenne Twister: A 623-Dimensionally Equidistributed Uniform  
Pseudo-Random Number Generator",
ACM Transactions on Modeling and Computer Simulation,
Vol. 8, No. 1, January 1998, pp 3--30.

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