| /* Mersenne twister implementation from Michael Brundage. Public Domain. |
| MT is a very fast pseudo random number generator. This version works |
| on 32bit words. Changes by AK. */ |
| #include <stdlib.h> |
| #include "mt.h" |
| |
| int mt_index; |
| unsigned int mt_buffer[MT_LEN]; |
| |
| void mt_init(void) |
| { |
| int i; |
| srand(1); |
| for (i = 0; i < MT_LEN; i++) |
| mt_buffer[i] = rand(); |
| mt_index = 0; |
| } |
| |
| #define MT_IA 397 |
| #define MT_IB (MT_LEN - MT_IA) |
| #define UPPER_MASK 0x80000000 |
| #define LOWER_MASK 0x7FFFFFFF |
| #define MATRIX_A 0x9908B0DF |
| #define TWIST(b,i,j) ((b)[i] & UPPER_MASK) | ((b)[j] & LOWER_MASK) |
| #define MAGIC(s) (((s)&1)*MATRIX_A) |
| |
| void mt_refill(void) |
| { |
| int i; |
| unsigned int s; |
| unsigned int * b = mt_buffer; |
| |
| mt_index = 0; |
| i = 0; |
| for (; i < MT_IB; i++) { |
| s = TWIST(b, i, i+1); |
| b[i] = b[i + MT_IA] ^ (s >> 1) ^ MAGIC(s); |
| } |
| for (; i < MT_LEN-1; i++) { |
| s = TWIST(b, i, i+1); |
| b[i] = b[i - MT_IB] ^ (s >> 1) ^ MAGIC(s); |
| } |
| |
| s = TWIST(b, MT_LEN-1, 0); |
| b[MT_LEN-1] = b[MT_IA-1] ^ (s >> 1) ^ MAGIC(s); |
| } |