Mersenne Twister
The Mersenne Twister is a pseudorandom number generator (PRNG). It is by far the most widely used general-purpose PRNG. Its name derives from the fact that its period length is chosen to be a Mersenne prime.
private const uint N = 624;
private const uint M = 397;
private const uint K = 0x9908B0DFU;
private static uint[] state = new uint[N + 1];
private static uint nextRand;
private static int left = -1;
private static uint HighestBit(uint u)
{
return ((u) & 0x80000000U);
}
private static uint LowestBit(uint u)
{
return ((u) & 0x00000001U);
}
private static uint LowestBits(uint u)
{
return ((u) & 0x7FFFFFFFU);
}
private static uint MixBits(uint u, uint v)
{
return (HighestBit(u) | LowestBits(v));
}
public static void Seed(uint seed)
{
uint x = (seed | 1U) & 0xFFFFFFFFU;
uint[] s = state;
int j;
int i = 0;
for (left = 0, s[i++] = x, j = (int)N; Convert.ToBoolean(--j); s[i++] = (x *= 69069U) & 0xFFFFFFFFU) ;
}
private static uint Reload()
{
uint p0 = 0;
uint p2 = 2;
uint pM = M;
uint s0;
uint s1;
int j;
if (left < -1)
{
Seed(4357U);
}
left = (int)(N - 1);
nextRand = state[1];
for (s0 = state[0], s1 = state[1], j = (int)(N - M + 1); Convert.ToBoolean(--j); s0 = s1, s1 = state[p2++])
{
state[p0++] = state[pM++] ^ (MixBits(s0, s1) >> 1) ^ (Convert.ToBoolean(LowestBit(s1)) ? K : 0U);
}
for (pM = 0, j = (int)M; Convert.ToBoolean(--j); s0 = s1, s1 = state[p2++])
{
state[p0++] = state[pM++] ^ (MixBits(s0, s1) >> 1) ^ (Convert.ToBoolean(LowestBit(s1)) ? K : 0U);
}
s1 = state[0];
state[p0] = state[pM] ^ (MixBits(s0, s1) >> 1) ^ (Convert.ToBoolean(LowestBit(s1)) ? K : 0U);
s1 ^= (s1 >> 11);
s1 ^= (s1 << 7) & 0x9D2C5680U;
s1 ^= (s1 << 15) & 0xEFC60000U;
return (s1 ^ (s1 >> 18));
}
public static uint Random()
{
uint y;
if (--left < 0)
{
return Reload();
}
y = nextRand++;
y ^= (y >> 11);
y ^= (y << 7) & 0x9D2C5680U;
y ^= (y << 15) & 0xEFC60000U;
return (y ^ (y >> 18));
}
Example
Seed(15858);
uint rand = Random();
Output
3748065792