# 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) ;
}

{
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)
{
}

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`
```