--- /dev/null
+diff -urN orig/include/config.h RND_MT/include/config.h\r
+--- orig/include/config.h Sat Jan 10 19:06:48 2004\r
++++ RND_MT/include/config.h Fri Jul 23 23:47:06 2004\r
+@@ -354,6 +354,7 @@\r
+ \r
+ #define EXP_ON_BOTL /* Show experience on bottom line */\r
+ /* #define SCORE_ON_BOTL */ /* added by Gary Erickson (erickson@ucivax) */\r
++#define RAND_MT /* use mersenne twister for random number */\r
+ \r
+ /*\r
+ * Section 5: EXPERIMENTAL STUFF\r
+diff -urN orig/include/extern.h RND_MT/include/extern.h\r
+--- orig/include/extern.h Thu Apr 29 20:14:34 2004\r
++++ RND_MT/include/extern.h Fri Jul 23 23:48:12 2004\r
+@@ -1710,6 +1710,9 @@\r
+ E int FDECL(d, (int,int));\r
+ E int FDECL(rne, (int));\r
+ E int FDECL(rnz, (int));\r
++#ifdef RAND_MT\r
++E void FDECL(init_genrand, (unsigned long));\r
++#endif /* RAND_MT */\r
+ \r
+ /* ### role.c ### */\r
+ \r
+diff -urN orig/src/hacklib.c RND_MT/src/hacklib.c\r
+--- orig/src/hacklib.c Fri Dec 5 01:21:28 2003\r
++++ RND_MT/src/hacklib.c Fri Jul 23 23:50:30 2004\r
+@@ -482,6 +482,16 @@\r
+ /* the types are different enough here that sweeping the different\r
+ * routine names into one via #defines is even more confusing\r
+ */\r
++#ifdef RAND_MT\r
++\r
++ #ifdef BSD\r
++ init_genrand((unsigned long) time((long *)0));\r
++ #else\r
++ init_genrand((unsigned long) time((time_t *)0));\r
++ #endif\r
++\r
++#else /* RAND_MT */\r
++\r
+ #ifdef RANDOM /* srandom() from sys/share/random.c */\r
+ srandom((unsigned int) time((time_t *)0));\r
+ #else\r
+@@ -502,6 +512,7 @@\r
+ # endif\r
+ # endif\r
+ #endif\r
++#endif /* RAND_MT */\r
+ }\r
+ \r
+ static struct tm *\r
+diff -urN orig/src/rnd.c RND_MT/src/rnd.c\r
+--- orig/src/rnd.c Sun Apr 28 00:36:36 2002\r
++++ RND_MT/src/rnd.c Wed Aug 28 22:02:04 2002\r
+@@ -3,6 +3,8 @@\r
+ \r
+ #include "hack.h"\r
+ \r
++#ifndef RAND_MT\r
++\r
+ /* "Rand()"s definition is determined by [OS]conf.h */\r
+ #if defined(LINT) && defined(UNIX) /* rand() is long... */\r
+ extern int NDECL(rand);\r
+@@ -16,6 +18,15 @@\r
+ # endif\r
+ #endif /* LINT */\r
+ \r
++#else /* RAND_MT */\r
++\r
++STATIC_DCL void NDECL(next_state);\r
++STATIC_DCL unsigned long NDECL(genrand_int32);\r
++/*#define RND(x) (int)(genrand_int32() % (unsigned long)(x))*/\r
++#define RND(x) (int)((double)(x) * (double)genrand_int32() * (1.0/4294967296.0))\r
++\r
++#endif /* RAND_MT */\r
++\r
+ #ifdef OVL0\r
+ \r
+ int\r
+@@ -142,4 +153,120 @@\r
+ \r
+ #endif /* OVLB */\r
+ \r
++#ifdef RAND_MT\r
++\r
++/* \r
++ A C-program for MT19937, with initialization improved 2002/2/10.\r
++ Coded by Takuji Nishimura and Makoto Matsumoto.\r
++ This is a faster version by taking Shawn Cokus's optimization,\r
++ Matthe Bellew's simplification, Isaku Wada's real version.\r
++\r
++ Before using, initialize the state by using init_genrand(seed) \r
++ or init_by_array(init_key, key_length).\r
++\r
++ Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,\r
++ All rights reserved. \r
++\r
++ Redistribution and use in source and binary forms, with or without\r
++ modification, are permitted provided that the following conditions\r
++ are met:\r
++\r
++ 1. Redistributions of source code must retain the above copyright\r
++ notice, this list of conditions and the following disclaimer.\r
++\r
++ 2. Redistributions in binary form must reproduce the above copyright\r
++ notice, this list of conditions and the following disclaimer in the\r
++ documentation and/or other materials provided with the distribution.\r
++\r
++ 3. The names of its contributors may not be used to endorse or promote \r
++ products derived from this software without specific prior written \r
++ permission.\r
++\r
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
++ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
++ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
++ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
++ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
++ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
++ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
++ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
++ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
++\r
++\r
++ Any feedback is very welcome.\r
++ http://www.math.keio.ac.jp/matumoto/emt.html\r
++ email: matumoto@math.keio.ac.jp\r
++*/\r
++\r
++/* Period parameters */ \r
++#define N_MT 624\r
++#define M_MT 397\r
++#define MATRIX_A 0x9908b0dfUL /* constant vector a */\r
++#define UMASK 0x80000000UL /* most significant w-r bits */\r
++#define LMASK 0x7fffffffUL /* least significant r bits */\r
++#define MIXBITS(u,v) ( ((u) & UMASK) | ((v) & LMASK) )\r
++#define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL))\r
++\r
++static unsigned long state[N_MT]; /* the array for the state vector */\r
++static int left = 1;\r
++/*static int initf = 0;*/\r
++static unsigned long *next;\r
++\r
++/* initializes state[N] with a seed */\r
++void init_genrand(unsigned long s)\r
++{\r
++ int j;\r
++ state[0]= s & 0xffffffffUL;\r
++ for (j=1; j<N_MT; j++) {\r
++ state[j] = (1812433253UL * (state[j-1] ^ (state[j-1] >> 30)) + j); \r
++ /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */\r
++ /* In the previous versions, MSBs of the seed affect */\r
++ /* only MSBs of the array state[]. */\r
++ /* 2002/01/09 modified by Makoto Matsumoto */\r
++ state[j] &= 0xffffffffUL; /* for >32 bit machines */\r
++ }\r
++ left = 1; /*initf = 1;*/\r
++}\r
++\r
++static void next_state(void)\r
++{\r
++ unsigned long *p=state;\r
++ int j;\r
++\r
++ /* if init_genrand() has not been called, */\r
++ /* a default initial seed is used */\r
++/* if (initf==0) init_genrand(5489UL);*/\r
++\r
++ left = N_MT;\r
++ next = state;\r
++ \r
++ for (j=N_MT-M_MT+1; --j; p++) \r
++ *p = p[M_MT] ^ TWIST(p[0], p[1]);\r
++\r
++ for (j=M_MT; --j; p++) \r
++ *p = p[M_MT-N_MT] ^ TWIST(p[0], p[1]);\r
++\r
++ *p = p[M_MT-N_MT] ^ TWIST(p[0], state[0]);\r
++}\r
++\r
++/* generates a random number on [0,0xffffffff]-interval */\r
++unsigned long genrand_int32(void)\r
++{\r
++ unsigned long y;\r
++\r
++ if (--left == 0) next_state();\r
++ y = *next++;\r
++\r
++ /* Tempering */\r
++ y ^= (y >> 11);\r
++ y ^= (y << 7) & 0x9d2c5680UL;\r
++ y ^= (y << 15) & 0xefc60000UL;\r
++ y ^= (y >> 18);\r
++\r
++ return y;\r
++}\r
++\r
++#endif // RAND_MT\r
+ /*rnd.c*/\r
+diff -urN orig/src/rumors.c RND_MT/src/rumors.c\r
+--- orig/src/rumors.c Thu Apr 29 19:59:36 2004\r
++++ RND_MT/src/rumors.c Fri Jul 23 23:52:20 2004\r
+@@ -114,11 +114,19 @@\r
+ switch (adjtruth = truth + rn2(2)) {\r
+ case 2: /*(might let a bogus input arg sneak thru)*/\r
+ case 1: beginning = true_rumor_start;\r
++#ifdef RAND_MT\r
++ tidbit = rn2(true_rumor_size);\r
++#else\r
+ tidbit = Rand() % true_rumor_size;\r
++#endif\r
+ break;\r
+ case 0: /* once here, 0 => false rather than "either"*/\r
+ case -1: beginning = false_rumor_start;\r
++#ifdef RAND_MT\r
++ tidbit = rn2(false_rumor_size);\r
++#else\r
+ tidbit = Rand() % false_rumor_size;\r
++#endif\r
+ break;\r
+ default:\r
+ impossible("strange truth value for rumor");\r