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.
/*****Please include following header files*****/
// cstdint
/***********************************************/
#define N (624)
#define M (397)
#define K (0x9908B0DFU)
#define HighestBit(u) ((u) & 0x80000000U)
#define LowestBit(u) ((u) & 0x00000001U)
#define LowestBits(u) ((u) & 0x7FFFFFFFU)
#define MixBits(u, v) (HighestBit(u)|LowestBits(v))
static uint32_t state[N + 1];
static uint32_t *nextRand;
static int left = -1;
static void Seed(uint32_t seed)
{
register uint32_t x = (seed | 1U) & 0xFFFFFFFFU;
register uint32_t *s = state;
register int j;
for (left = 0, *s++ = x, j = N; --j; *s++ = (x *= 69069U) & 0xFFFFFFFFU);
}
static uint32_t Reload()
{
register uint32_t *p0 = state;
register uint32_t *p2 = state + 2;
register uint32_t *pM = state + M;
register uint32_t s0;
register uint32_t s1;
register int j;
if (left < -1) {
Seed(4357U);
}
left = N - 1;
nextRand = state + 1;
for (s0 = state[0], s1 = state[1], j = N - M + 1; --j; s0 = s1, s1 = *p2++) {
*p0++ = *pM++ ^ (MixBits(s0, s1) >> 1) ^ (LowestBit(s1) ? K : 0U);
}
for (pM = state, j = M; --j; s0 = s1, s1 = *p2++) {
*p0++ = *pM++ ^ (MixBits(s0, s1) >> 1) ^ (LowestBit(s1) ? K : 0U);
}
s1 = state[0];
*p0 = *pM ^ (MixBits(s0, s1) >> 1) ^ (LowestBit(s1) ? K : 0U);
s1 ^= (s1 >> 11);
s1 ^= (s1 << 7) & 0x9D2C5680U;
s1 ^= (s1 << 15) & 0xEFC60000U;
return (s1 ^ (s1 >> 18));
}
static uint32_t Random()
{
uint32_t 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(15858U);
uint32_t rand = Random();
Output
3748065792