public double getNextDouble(rk_state state) { /* shifts : 67108864 = 0x4000000, 9007199254740992 = 0x20000000000000 */ ulong a = getNextUInt64(state) >> 5; ulong b = getNextUInt64(state) >> 6; return((a * 67108864.0 + b) / 9007199254740992.0); }
public void Seed(ulong?seedValue, rk_state state) { if (seedValue.HasValue) { rnd = new Random((int)seedValue.Value); } else { rnd = new Random(); } return; }
public ulong getNextUInt64(rk_state state) { /* Magic Mersenne Twister constants */ const int N = 624; const int M = 397; const ulong MATRIX_A = 0x9908b0dfUL; const ulong UPPER_MASK = 0x80000000UL; const ulong LOWER_MASK = 0x7fffffffUL; ulong y; if (state.pos == RK_STATE_LEN) { int i; long ly; ulong uy; for (i = 0; i < N - M; i++) { y = (key[i] & UPPER_MASK) | (key[i + 1] & LOWER_MASK); ly = (long)(y & 1); uy = (ulong)-ly; key[i] = key[i + M] ^ (y >> 1) ^ (uy & MATRIX_A); } for (; i < N - 1; i++) { y = (key[i] & UPPER_MASK) | (key[i + 1] & LOWER_MASK); ly = (long)(y & 1); uy = (ulong)-ly; key[i] = key[i + (M - N)] ^ (y >> 1) ^ (uy & MATRIX_A); } y = (key[N - 1] & UPPER_MASK) | (key[0] & LOWER_MASK); ly = (long)(y & 1); uy = (ulong)-ly; key[N - 1] = key[M - 1] ^ (y >> 1) ^ (uy & MATRIX_A); state.pos = 0; } y = key[state.pos++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return(y); }
public void Seed(ulong?inseed, rk_state state) { uint pos; if (!inseed.HasValue) { inseed = (ulong)DateTime.Now.Ticks; } ulong seed = inseed.Value; seed &= 0xffffffffUL; /* Knuth's PRNG as used in the Mersenne Twister reference implementation */ for (pos = 0; pos < RK_STATE_LEN; pos++) { key[pos] = seed; seed = (1812433253UL * (seed ^ (seed >> 30)) + pos + 1) & 0xffffffffUL; } state.pos = RK_STATE_LEN; state.gauss = 0; state.has_gauss = false; state.has_binomial = false; }
public ulong getNextUInt64(rk_state state) { ulong randomValue = (ulong)rnd.Next() << 32 + rnd.Next(); return(randomValue); }
public double getNextDouble(rk_state state) { return(rnd.NextDouble()); }