public uint NextUnsigned()
{
// most significant w-r bits:
const uint upper_mask = 0x80000000U;
// least significant r bits:
const uint lower_mask = 0x7fffffffU;
uint result;
unchecked
{
// generate N words at one time:
if (mti >= N)
{
int k;
for (k = 0; k < N - M; k++)
{
result = (mt[k] & upper_mask) | (mt[k + 1] & lower_mask);
mt[k] = mt[k + M] ^ (result >> 1) ^ mag01[result & 1];
}
for (; k < N - 1; k++)
{
result = (mt[k] & upper_mask) | (mt[k + 1] & lower_mask);
mt[k] = mt[k + (M - N)] ^ (result >> 1) ^ mag01[result & 1];
}
result = (mt[N - 1] & upper_mask) | (mt[0] & lower_mask);
mt[N - 1] = mt[M - 1] ^ (result >> 1) ^ mag01[result & 1];
mti = 0;
}
result = mt[mti++];
// tempering:
result ^= (result >> 11);
result ^= (result << 7) & 0x9d2c5680U;
result ^= (result << 15) & 0xefc60000U;
result ^= (result >> 18);
}
return result;
}