1
Fork 0
mirror of https://github.com/naehrwert/scetool.git synced 2025-04-19 18:06:50 +00:00
scetool/mt19937.cpp

50 lines
1.1 KiB
C++
Raw Normal View History

2013-05-10 13:02:25 +02:00
#include "mt19937.h"
void mt19937_init(mt19937_ctxt_t *ctxt, unsigned int seed)
{
ctxt->state[0] = seed;
for(ctxt->idx = 1; ctxt->idx < MT_N; ctxt->idx++)
ctxt->state[ctxt->idx] = (1812433253 * (ctxt->state[ctxt->idx - 1] ^ (ctxt->state[ctxt->idx - 1] >> 30)) + ctxt->idx);
ctxt->idx = MT_M + 1;
}
unsigned int mt19937_update(mt19937_ctxt_t *ctxt)
{
unsigned int y, k;
static unsigned int mag01[2] = {0, MT_MATRIX_A};
if(ctxt->idx >= MT_N)
{
for(k = 0; k < MT_N - MT_M; k++)
{
y = (ctxt->state[k] & MT_UPPER_MASK) |
(ctxt->state[k + 1] & MT_LOWER_MASK);
ctxt->state[k] = ctxt->state[k + MT_M] ^ (y >> 1) ^ mag01[y & 1];
}
for(; k < MT_N - 1; k++)
{
y = (ctxt->state[k] & MT_UPPER_MASK) |
(ctxt->state[k + 1] & MT_LOWER_MASK);
ctxt->state[k] = ctxt->state[k + (MT_M - MT_N)] ^ (y >> 1) ^ mag01[y & 1];
}
y = (ctxt->state[MT_N - 1] & MT_UPPER_MASK) |
(ctxt->state[0] & MT_LOWER_MASK);
ctxt->state[MT_N - 1] = ctxt->state[MT_M - 1] ^ (y >> 1) ^ mag01[y & 1];
ctxt->idx = 0;
}
y = ctxt->state[ctxt->idx++];
y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680UL;
y ^= (y << 15) & 0xefc60000UL;
y ^= (y >> 18);
return y;
}