58#ifndef MERSENNETWISTER_H
59#define MERSENNETWISTER_H
100 double rand(
const double n );
102 double randExc(
const double n );
111 double randNorm(
const double mean = 0.0,
const double stddev = 1.0 );
134 {
return loBit(u) ? 0x9908b0dfUL : 0x0UL; }
151 unsigned char *p = (
unsigned char *) &t;
152 for(
size_t i = 0; i <
sizeof(t); ++i )
154 h1 *= UCHAR_MAX + 2U;
158 p = (
unsigned char *) &c;
159 for(
size_t j = 0; j <
sizeof(c); ++j )
161 h2 *= UCHAR_MAX + 2U;
164 return ( h1 + differ++ ) ^ h2;
176 *s++ =
seed & 0xffffffffUL;
179 *s++ = ( 1812433253UL * ( *r ^ (*r >> 30) ) + i ) & 0xffffffffUL;
188 static const int MmN = int(
M) - int(
N);
191 for( i =
N -
M; i--; ++p )
192 *p =
twist( p[
M], p[0], p[1] );
193 for( i =
M; --i; ++p )
194 *p =
twist( p[MmN], p[0], p[1] );
219 register int k = (
uint32(
N) > seedLength ?
uint32(
N) : seedLength );
224 state[i] += ( bigSeed[j] & 0xffffffffUL ) + j;
225 state[i] &= 0xffffffffUL;
228 if( j >= seedLength ) j = 0;
230 for( k =
N - 1; k; --k )
235 state[i] &= 0xffffffffUL;
239 state[0] = 0x80000000UL;
249#if defined(Q_CC_INTEL) || defined(Q_CC_GNU)
250 FILE* urandom = fopen(
"/dev/urandom",
"rb" );
253 fopen_s(&urandom,
"/dev/urandom",
"rb" );
258 register uint32 *s = bigSeed;
260 register bool success =
true;
261 while( success && i-- )
262 success = fread( s++,
sizeof(
uint32), 1, urandom );
264 if( success ) {
seed( bigSeed,
N );
return; }
268 seed(
hash( time(NULL), clock() ) );
275 {
seed(bigSeed,seedLength); }
285 for( ; i--; *s++ = *t++ ) {}
301 s1 ^= (s1 << 7) & 0x9d2c5680UL;
302 s1 ^= (s1 << 15) & 0xefc60000UL;
303 return ( s1 ^ (s1 >> 18) );
326 {
return double(
randInt()) * (1.0/4294967295.0); }
329 {
return rand() * n; }
332 {
return double(
randInt()) * (1.0/4294967296.0); }
338 {
return (
double(
randInt()) + 0.5 ) * (1.0/4294967296.0); }
346 return ( a * 67108864.0 + b ) * (1.0/9007199254740992.0);
356 x = 2.0 *
rand() - 1.0;
357 y = 2.0 *
rand() - 1.0;
360 while ( r >= 1.0 || r == 0.0 );
361 double s = sqrt( -2.0 * log(r) / r );
362 return mean + x * s * stddev;
373 register uint32 *sa = saveArray;
375 for( ; i--; *sa++ = *s++ ) {}
382 register uint32 *la = loadArray;
384 for( ; i--; *s++ = *la++ ) {}
392 register int i = mtrand.
N;
393 for( ; i--; os << *s++ <<
"\t" ) {}
394 return os << mtrand.
left;
400 register int i = mtrand.
N;
401 for( ; i--; is >> *s++ ) {}
409 if(
this == &o )
return (*
this);
413 for( ; i--; *s++ = *t++ ) {}
std::ostream & operator<<(std::ostream &os, const MTRand &mtrand)
Definition: MersenneTwister.h:389
std::istream & operator>>(std::istream &is, MTRand &mtrand)
Definition: MersenneTwister.h:397
Definition: MersenneTwister.h:70
@ SAVE
Definition: MersenneTwister.h:76
double rand53()
Definition: MersenneTwister.h:343
void reload()
Definition: MersenneTwister.h:184
MTRand()
Definition: MersenneTwister.h:277
uint32 * pNext
Definition: MersenneTwister.h:82
uint32 state[N]
Definition: MersenneTwister.h:81
uint32 twist(const uint32 m, const uint32 s0, const uint32 s1) const
Definition: MersenneTwister.h:135
MTRand & operator=(const MTRand &o)
Definition: MersenneTwister.h:407
unsigned long uint32
Definition: MersenneTwister.h:73
static uint32 hash(time_t t, clock_t c)
Definition: MersenneTwister.h:142
double randNorm(const double mean=0.0, const double stddev=1.0)
Definition: MersenneTwister.h:349
double randDblExc()
Definition: MersenneTwister.h:337
friend std::ostream & operator<<(std::ostream &os, const MTRand &mtrand)
Definition: MersenneTwister.h:389
@ M
Definition: MersenneTwister.h:79
double rand()
Definition: MersenneTwister.h:325
@ N
Definition: MersenneTwister.h:75
uint32 hiBit(const uint32 u) const
Definition: MersenneTwister.h:128
void load(uint32 *const loadArray)
Definition: MersenneTwister.h:379
uint32 loBits(const uint32 u) const
Definition: MersenneTwister.h:130
uint32 loBit(const uint32 u) const
Definition: MersenneTwister.h:129
int left
Definition: MersenneTwister.h:83
void initialize(const uint32 oneSeed)
Definition: MersenneTwister.h:167
void save(uint32 *saveArray) const
Definition: MersenneTwister.h:370
double operator()()
Definition: MersenneTwister.h:365
friend std::istream & operator>>(std::istream &is, MTRand &mtrand)
Definition: MersenneTwister.h:397
uint32 randInt()
Definition: MersenneTwister.h:290
uint32 mixBits(const uint32 u, const uint32 v) const
Definition: MersenneTwister.h:131
void seed()
Definition: MersenneTwister.h:243
uint32 magic(const uint32 u) const
Definition: MersenneTwister.h:133
double randExc()
Definition: MersenneTwister.h:331