|
STK++
0.4
|
Generate unsigner 32 bits random number using the Merdsenne Twister Algorithm. More...
#include <MersenneTwister.h>

Public Types | |
| enum | { N = 624 } |
| enum | { SAVE = N + 1 } |
| typedef unsigned long | uint32 |
| unsigned integer type, at least 32 bits | |
Public Member Functions | |
| MTRand (const uint32 &oneSeed) | |
| Initialize with a simple uint32. | |
| MTRand (uint32 *const bigSeed, uint32 const seedLength=N) | |
| Initialize with a an array. | |
| MTRand () | |
| auto-initialize with /dev/urandom or time() and clock() | |
| double | rand () |
| real number in [0,1] | |
| double | rand (const double &n) |
| real number in [0,n] | |
| double | randExc () |
| real number in [0,1) | |
| double | randExc (const double &n) |
| real number in [0,n) | |
| double | randDblExc () |
| real number in (0,1) | |
| double | randDblExc (const double &n) |
| real number in (0,n) | |
| uint32 | randInt () |
| integer in [0,2^32-1] | |
| double | operator() () |
| same as rand(). | |
| uint32 | randInt (const uint32 &n) |
| integer in [0,n] for n < 2^32 | |
| double | rand53 () |
| Access to 53-bit random numbers (capacity of IEEE double precision). | |
| double | randNorm (const double &mean, const double &variance) |
| Access to nonuniform random number distributions. | |
| void | seed (const uint32 oneSeed) |
| Re-seeding functions with same behavior as initializers. | |
| void | seed (uint32 *const bigSeed, const uint32 seedLength) |
| Re-seeding functions with same behavior as initializers. | |
| void | seed () |
| Re-seeding functions with same behavior as initializers. | |
| void | save (uint32 *saveArray) const |
| Saving and loading generator state. | |
| void | load (uint32 *const loadArray) |
| Saving and loading generator state. | |
Protected Types | |
| enum | { M = 397 } |
Protected Member Functions | |
| void | initialize (const uint32 seed) |
| Initialize generator state with seed See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier. | |
| void | reload () |
| Generate N new values in state Made disposeer and faster by Matthew Bellew (matthew.bellew@home.com) | |
| uint32 | hiBit (const uint32 &u) const |
| High bit. | |
| uint32 | loBit (const uint32 &u) const |
| low bit. | |
| uint32 | loBits (const uint32 &u) const |
| low bits. | |
| uint32 | mixBits (const uint32 &u, const uint32 &v) const |
| mixed bits. | |
| uint32 | twist (const uint32 &m, const uint32 &s0, const uint32 &s1) const |
| twisted values. | |
Static Protected Member Functions | |
| static uint32 | hash (time_t t, clock_t c) |
| Get a uint32 from t and c Better than uint32(x) in case x is floating point in [0,1] Based on code by Lawrence Kirby (fred@genesis.demon.co.uk) | |
Protected Attributes | |
| uint32 | state [N] |
| internal state | |
| uint32 * | pNext |
| Next value to get from state. | |
| int | left |
| number of values left before reload needed | |
Friends | |
| std::ostream & | operator<< (std::ostream &os, const MTRand &mtrand) |
| std::istream & | operator>> (std::istream &is, MTRand &mtrand) |
Generate unsigner 32 bits random number using the Merdsenne Twister Algorithm.
The Mersenne Twister is an algorithm for generating random numbers. It was designed with consideration of the flaws in various other generators. The period, 2^19937-1, and the order of equidistribution, 623 dimensions, are far greater. The generator is also fast; it avoids multiplication and division, and it benefits from caches and pipelines. For more information see the inventors' web page at http://www.math.keio.ac.jp/~matumoto/emt.html
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.
Do NOT use for CRYPTOGRAPHY without securely hashing several returned values together, otherwise the generator state can be learned after reading 624 consecutive values. Access to 32-bit random numbers
Not thread safe (unless auto-initialization is avoided and each thread has its own MTRand object)
Definition at line 87 of file MersenneTwister.h.
| typedef unsigned long MTRand::uint32 |
unsigned integer type, at least 32 bits
Definition at line 92 of file MersenneTwister.h.
| anonymous enum |
| anonymous enum |
anonymous enum [protected] |
| MTRand::MTRand | ( | const uint32 & | oneSeed | ) | [inline] |
Initialize with a simple uint32.
Definition at line 107 of file MersenneTwister.h.
References seed().
{ seed(oneSeed); }
| MTRand::MTRand | ( | uint32 *const | bigSeed, |
| uint32 const | seedLength = N |
||
| ) | [inline] |
Initialize with a an array.
Definition at line 111 of file MersenneTwister.h.
References seed().
{ seed(bigSeed,seedLength); }
| MTRand::MTRand | ( | ) | [inline] |
auto-initialize with /dev/urandom or time() and clock()
Definition at line 115 of file MersenneTwister.h.
References seed().
{ seed(); }
| double MTRand::rand | ( | ) | [inline] |
real number in [0,1]
Definition at line 119 of file MersenneTwister.h.
References randInt().
Referenced by operator()().
{ return double(randInt()) * (1.0/4294967295.0); }
| double MTRand::rand | ( | const double & | n | ) | [inline] |
real number in [0,n]
Definition at line 123 of file MersenneTwister.h.
References rand().
Referenced by rand().
{ return rand() * n; }
| double MTRand::randExc | ( | ) | [inline] |
real number in [0,1)
Definition at line 127 of file MersenneTwister.h.
References randInt().
Referenced by randNorm().
{ return double(randInt()) * (1.0/4294967296.0); }
| double MTRand::randExc | ( | const double & | n | ) | [inline] |
real number in [0,n)
Definition at line 131 of file MersenneTwister.h.
References randExc().
Referenced by randExc().
{ return randExc() * n; }
| double MTRand::randDblExc | ( | ) | [inline] |
real number in (0,1)
Definition at line 135 of file MersenneTwister.h.
References randInt().
Referenced by randNorm(), and STK::RandBase::randUnif().
{ return ( double(randInt()) + 0.5 ) * (1.0/4294967296.0); }
| double MTRand::randDblExc | ( | const double & | n | ) | [inline] |
real number in (0,n)
Definition at line 139 of file MersenneTwister.h.
References randDblExc().
Referenced by randDblExc().
{ return randDblExc() * n; }
| uint32 MTRand::randInt | ( | ) | [inline] |
integer in [0,2^32-1]
Definition at line 143 of file MersenneTwister.h.
References left, pNext, and reload().
Referenced by rand(), rand53(), randDblExc(), STK::RandBase::randDiscreteUnif(), randExc(), STK::RandBase::randGauss(), and randInt().
{
// Pull a 32-bit integer from the generator state
// Every other access function simply transforms the numbers
// extracted here
if( left == 0 ) reload();
--left;
register uint32 s1;
s1 = *pNext++;
s1 ^= (s1 >> 11);
s1 ^= (s1 << 7) & 0x9d2c5680UL;
s1 ^= (s1 << 15) & 0xefc60000UL;
return ( s1 ^ (s1 >> 18) );
}
| double MTRand::operator() | ( | ) | [inline] |
same as rand().
Reimplemented in STK::RandBase.
Definition at line 159 of file MersenneTwister.h.
References rand().
{ return rand(); }
| uint32 MTRand::randInt | ( | const uint32 & | n | ) | [inline] |
integer in [0,n] for n < 2^32
Definition at line 162 of file MersenneTwister.h.
References randInt().
{
// Find which bits are used in n
// Optimized by Magnus Jonsson (magnus@smartelectronix.com)
uint32 used = n;
used |= used >> 1;
used |= used >> 2;
used |= used >> 4;
used |= used >> 8;
used |= used >> 16;
// Draw numbers until one is found in [0,n]
uint32 i;
do
i = randInt() & used; // toss unused bits to shorten search
while( i > n );
return i;
}
| double MTRand::rand53 | ( | ) | [inline] |
| double MTRand::randNorm | ( | const double & | mean, |
| const double & | variance | ||
| ) | [inline] |
Access to nonuniform random number distributions.
Return a real number from a normal (Gaussian) distribution with given mean and variance by Box-Muller method.
Definition at line 195 of file MersenneTwister.h.
References randDblExc(), randExc(), and STK::Stat::variance().
{
double r = sqrt( -2.0 * log( 1.0-randDblExc()) ) * variance;
double phi = STK::Const::_2PI_ * randExc();
return mean + r * cos(phi);
}
| void MTRand::seed | ( | const uint32 | oneSeed | ) | [inline] |
Re-seeding functions with same behavior as initializers.
Seed the generator with a simple uint32
Definition at line 204 of file MersenneTwister.h.
References initialize(), and reload().
{
initialize(oneSeed);
reload();
}
| void MTRand::seed | ( | uint32 *const | bigSeed, |
| const uint32 | seedLength | ||
| ) | [inline] |
Re-seeding functions with same behavior as initializers.
Seed the generator with an array of uint32's There are 2^19937-1 possible initial states. This function allows all of those to be accessed by providing at least 19937 bits (with a default seed length of N = 624 uint32's). Any bits above the lower 32 in each element are discarded. Just call seed() if you want to get array from /dev/urandom
Definition at line 218 of file MersenneTwister.h.
References initialize(), N, reload(), and state.
{
initialize(19650218UL);
register int i = 1;
register uint32 j = 0;
register int k = ( N > seedLength ? N : seedLength );
for( ; k; --k )
{
state[i] =
state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1664525UL );
state[i] += ( bigSeed[j] & 0xffffffffUL ) + j;
state[i] &= 0xffffffffUL;
++i; ++j;
if( i >= N ) { state[0] = state[N-1]; i = 1; }
if( j >= seedLength ) j = 0;
}
for( k = N - 1; k; --k )
{
state[i] =
state[i] ^ ( (state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL );
state[i] -= i;
state[i] &= 0xffffffffUL;
++i;
if( i >= N ) { state[0] = state[N-1]; i = 1; }
}
state[0] = 0x80000000UL;// MSB is 1, assuring non-zero initial array
reload();
}
| void MTRand::seed | ( | ) | [inline] |
Re-seeding functions with same behavior as initializers.
Seed the generator with an array from /dev/urandom if available Otherwise use a hash of time() and clock() values
Definition at line 251 of file MersenneTwister.h.
Referenced by MTRand(), and STK::RandBase::RandBase().
{
// First try getting an array from /dev/urandom
FILE* urandom = fopen( "/dev/urandom", "rb" );
if( urandom )
{
uint32 bigSeed[N];
register uint32 *s = bigSeed;
register int i = N;
register bool success = true;
while( success && i-- )
success = fread( s++, sizeof(uint32), 1, urandom );
fclose(urandom);
if( success ) { seed( bigSeed, N ); return; }
}
// Was not successful, so use time() and clock() instead
seed( hash( time(NULL), clock() ) );
}
| void MTRand::save | ( | uint32 * | saveArray | ) | const [inline] |
| void MTRand::load | ( | uint32 *const | loadArray | ) | [inline] |
| void MTRand::initialize | ( | const uint32 | seed | ) | [inline, protected] |
Initialize generator state with seed See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier.
In previous versions, most significant bits (MSBs) of the seed affect only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto.
Definition at line 308 of file MersenneTwister.h.
Referenced by seed().
| void MTRand::reload | ( | ) | [inline, protected] |
Generate N new values in state Made disposeer and faster by Matthew Bellew (matthew.bellew@home.com)
Definition at line 325 of file MersenneTwister.h.
| uint32 MTRand::hiBit | ( | const uint32 & | u | ) | const [inline, protected] |
High bit.
Definition at line 338 of file MersenneTwister.h.
Referenced by mixBits().
{ return u & 0x80000000UL; }
| uint32 MTRand::loBit | ( | const uint32 & | u | ) | const [inline, protected] |
low bit.
Definition at line 342 of file MersenneTwister.h.
Referenced by twist().
{ return u & 0x00000001UL; }
| uint32 MTRand::loBits | ( | const uint32 & | u | ) | const [inline, protected] |
low bits.
Definition at line 346 of file MersenneTwister.h.
Referenced by mixBits().
{ return u & 0x7fffffffUL; }
| uint32 MTRand::mixBits | ( | const uint32 & | u, |
| const uint32 & | v | ||
| ) | const [inline, protected] |
| uint32 MTRand::twist | ( | const uint32 & | m, |
| const uint32 & | s0, | ||
| const uint32 & | s1 | ||
| ) | const [inline, protected] |
| static uint32 MTRand::hash | ( | time_t | t, |
| clock_t | c | ||
| ) | [inline, static, protected] |
Get a uint32 from t and c Better than uint32(x) in case x is floating point in [0,1] Based on code by Lawrence Kirby (fred@genesis.demon.co.uk)
Definition at line 361 of file MersenneTwister.h.
Referenced by seed().
{
static uint32 differ = 0; // guarantee time-based seeds will change
uint32 h1 = 0;
unsigned char *p = (unsigned char *) &t;
for( size_t i = 0; i < sizeof(t); ++i )
{
h1 *= UCHAR_MAX + 2U;
h1 += p[i];
}
uint32 h2 = 0;
p = (unsigned char *) &c;
for( size_t j = 0; j < sizeof(c); ++j )
{
h2 *= UCHAR_MAX + 2U;
h2 += p[j];
}
return ( h1 + differ++ ) ^ h2;
}
| std::ostream& operator<< | ( | std::ostream & | os, |
| const MTRand & | mtrand | ||
| ) | [friend] |
Definition at line 383 of file MersenneTwister.h.
{
register const MTRand::uint32 *s = mtrand.state;
register int i = mtrand.N;
for( ; i--; os << *s++ << "\t" ) {}
return os << mtrand.left;
}
| std::istream& operator>> | ( | std::istream & | is, |
| MTRand & | mtrand | ||
| ) | [friend] |
Definition at line 392 of file MersenneTwister.h.
uint32 MTRand::state[N] [protected] |
internal state
Definition at line 100 of file MersenneTwister.h.
Referenced by initialize(), load(), operator<<(), operator>>(), reload(), save(), and seed().
uint32* MTRand::pNext [protected] |
Next value to get from state.
Definition at line 101 of file MersenneTwister.h.
Referenced by load(), operator>>(), randInt(), and reload().
int MTRand::left [protected] |
number of values left before reload needed
Definition at line 102 of file MersenneTwister.h.
Referenced by load(), operator<<(), operator>>(), randInt(), reload(), and save().
1.7.6.1