+// Structure for the random number functions.
+mt random_seed;
+
+#define MT(i) mt->array[i]
+
+void mt_init(mt *mt, unsigned int seed)
+{
+ int i;
+ MT(0)= seed;
+ for(i=1; i<MT_N; i++)
+ MT(i) = (1812433253 * (MT(i-1) ^ (MT(i-1) >> 30)) + i);
+ mt->index = MT_N+1;
+}
+
+void mt_init_time_10(mt *mt)
+{
+ mt_init(mt, (unsigned int) time(NULL) / 600);
+}
+
+unsigned int mt_rand32(mt *mt)
+{
+ unsigned int i, y;
+ if(mt->index >= MT_N) {
+ for(i=0; i<MT_N; i++) {
+ y = (MT(i) & 0x80000000) | (MT((i+1)%MT_N) & 0x7fffffff);
+ MT(i) = MT((i+MT_M)%MT_N) ^ (y>>1) ^ (y&1 ? 0x9908b0df : 0);
+ }
+ mt->index = 0;