1
/* Mersenne twister implementation from Michael Brundage. Public Domain.
2
MT is a very fast pseudo random number generator. This version works
3
on 32bit words. Minor changes by AK. */
9
unsigned int mt_buffer[MT_LEN];
15
for (i = 0; i < MT_LEN; i++)
16
mt_buffer[i] = rand();
21
#define MT_IB (MT_LEN - MT_IA)
22
#define UPPER_MASK 0x80000000
23
#define LOWER_MASK 0x7FFFFFFF
24
#define MATRIX_A 0x9908B0DF
25
#define TWIST(b,i,j) ((b)[i] & UPPER_MASK) | ((b)[j] & LOWER_MASK)
26
#define MAGIC(s) (((s)&1)*MATRIX_A)
28
unsigned int mt_random(void)
30
unsigned int * b = mt_buffer;
35
if (idx == MT_LEN*sizeof(unsigned int)) {
38
for (; i < MT_IB; i++) {
40
b[i] = b[i + MT_IA] ^ (s >> 1) ^ MAGIC(s);
42
for (; i < MT_LEN-1; i++) {
44
b[i] = b[i - MT_IB] ^ (s >> 1) ^ MAGIC(s);
47
s = TWIST(b, MT_LEN-1, 0);
48
b[MT_LEN-1] = b[MT_IA-1] ^ (s >> 1) ^ MAGIC(s);
50
mt_index = idx + sizeof(unsigned int);
51
return *(unsigned int *)((unsigned char *)b + idx);