61#define NN RAND_MT19937_NN
63#define MATRIX_A 0xB5026F5AA96619E9ULL
64#define UM 0xFFFFFFFF80000000ULL
65#define LM 0x7FFFFFFFULL
69void mt19937_init_genrand64(
unsigned long long seed,
random_t* prnd)
75 for (mti=1; mti<NN; mti++)
76 mt[mti] = (6364136223846793005ULL * (mt[mti-1] ^ (mt[mti-1] >> 62)) + mti);
84void mt19937_init_by_array64(
unsigned long long init_key[],
85 unsigned long long key_length,
88 unsigned long long i, j, k;
92 mt19937_init_genrand64(19650218ULL, prnd);
94 k = (NN>key_length ? NN : key_length);
96 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 3935559000370003845ULL))
99 if (i>=NN) { mt[0] = mt[NN-1]; i=1; }
100 if (j>=key_length) j=0;
102 for (k=NN-1; k; k--) {
104 mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 2862933555777941757ULL)) - i;
118unsigned long long mt19937_genrand64_int64(
random_t* prnd)
121 unsigned long long x;
122 static unsigned long long mag01[2]={0ULL, MATRIX_A};
131 mt19937_init_genrand64(5489ULL, prnd);
133 for (i=0;i<NN-MM;i++) {
134 x = (mt[i]&UM)|(mt[i+1]&LM);
135 mt[i] = mt[i+MM] ^ (x>>1) ^ mag01[(
int)(x&1ULL)];
138 x = (mt[i]&UM)|(mt[i+1]&LM);
139 mt[i] = mt[i+(MM-NN)] ^ (x>>1) ^ mag01[(int)(x&1ULL)];
141 x = (mt[NN-1]&UM)|(mt[0]&LM);
142 mt[NN-1] = mt[MM-1] ^ (x>>1) ^ mag01[(
int)(x&1ULL)];
149 x ^= (x >> 29) & 0x5555555555555555ULL;
150 x ^= (x << 17) & 0x71D67FFFEDA60000ULL;
151 x ^= (x << 37) & 0xFFF7EEE000000000ULL;
160long long mt19937_genrand64_int63(
random_t* prnd)
162 return (
long long)(mt19937_genrand64_int64(prnd) >> 1);
167double mt19937_genrand64_real1(
random_t* prnd)
169 return (mt19937_genrand64_int64(prnd) >> 11) * (1.0/9007199254740991.0);
174double mt19937_genrand64_real2(
random_t* prnd)
176 return (mt19937_genrand64_int64(prnd) >> 11) * (1.0/9007199254740992.0);
181double mt19937_init_genrand64_real3(
random_t* prnd)
183 return ((mt19937_genrand64_int64(prnd) >> 12) + 0.5) * (1.0/4503599627370496.0);
unsigned long long mt19937_mt[RAND_MT19937_NN]