psudo-number generator using Mersenne Twister algorithm implemented in C/C++
#define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL #define UPPER_MASK 0x80000000UL #define LOWER_MASK 0x7fffffffUL static unsigned long mt[N]; static int mti=N+1; static unsigned long mag01[2] = {0x0UL, MATRIX_A}; void MersenneTwister::init_genrand(unsigned long seed) { mt[0]= seed & 0xffffffffUL; for (mti = 1; mti = N) { if (mti == (N + 1)) init_genrand(4537); int kk; for (kk = 0; kk > 1) ^ mag01[y & 0x1UL]; } for (; kk> 1) ^ mag01[y & 0x1UL]; } y = (mt[N-1] & UPPER_MASK) | (mt[0] & LOWER_MASK); mt[N-1] = mt[M-1] ^ (int)(y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y <> 18); if (max == 0) return 0; else return (int)(y / 32) % max; } int main() { // Usage sample MersenneTwister *mt = new MersenneTwister(3); printf("%lu ", mt->genrandUInt32(125463)); return 0; }
Log in to answer.
leothenerd 2:58 pm on December 6, 2009