AC_CHECK_LIB(iconv, iconv_open)
+AC_CHECK_FILE(/dev/urandom, AC_DEFINE(RNG_DEVICE, "/dev/urandom", [Random Number Generation device file]))
+
dnl Checks for header files.
AC_PATH_XTRA
if test "$have_x" = yes; then
/* Init the RNG */
if (init_random_seed)
{
- u32b seed;
-
- /* Basic seed */
- seed = (time(NULL));
-
-#ifdef SET_UID
-
- /* Mutate the seed on Unix machines */
- seed = ((seed >> 3) * (getpid() << 1));
-
-#endif
-
- /* Seed the RNG */
- Rand_state_init(seed);
+ Rand_state_init();
}
/* Roll new character */
Rand_state_backup(state_backup);
/* Hack -- Induce consistant flavors */
- Rand_state_init(seed_flavor);
+ Rand_state_set(seed_flavor);
/* Initialize flavor index of each object by itself */
Rand_state_backup(state_backup);
/* Hack -- Induce consistant flavors */
- Rand_state_init(seed);
+ Rand_state_set(seed);
if (!corner)
{
Rand_state_backup(state_backup);
/* Hack -- Induce consistant flavors */
- Rand_state_init(wilderness[y][x].seed);
+ Rand_state_set(wilderness[y][x].seed);
dy = rand_range(6, cur_hgt - 6);
dx = rand_range(6, cur_wid - 6);
/*
* Initialize Xorshift Algorithm state
*/
-static void Rand_Xorshift_init(u32b seed, u32b* state)
+static void Rand_Xorshift_seed(u32b seed, u32b* state)
{
int i;
/*
* Initialize the RNG using a new seed
*/
-void Rand_state_init(u32b seed)
+void Rand_state_set(u32b seed)
{
- Rand_Xorshift_init(seed, Rand_state);
+ Rand_Xorshift_seed(seed, Rand_state);
+}
+
+void Rand_state_init(void)
+{
+#ifdef RNG_DEVICE
+
+ FILE *fp = fopen(RNG_DEVICE, "r");
+ u32b buf[4];
+ do {
+ fread(buf, sizeof(buf[0]), 4, fp);
+ } while ((buf[0] | buf[1] | buf[2] | buf[3]) == 0);
+ memcpy(Rand_state, buf, sizeof(buf));
+ fclose(fp);
+
+#else
+
+ /* Basic seed */
+ u32b seed = (time(NULL));
+#ifdef SET_UID
+ /* Mutate the seed on Unix machines */
+ seed = ((seed >> 3) * (getpid() << 1));
+#endif
+ /* Seed the RNG */
+ Rand_state_set(seed);
+
+#endif
}
/*
*
* Could also use rand() from <stdlib.h> directly. XXX XXX XXX
*/
-u32b Rand_external(u32b m)
+s32b Rand_external(s32b m)
{
static bool initialized = FALSE;
static u32b Rand_state_external[4];
{
/* Initialize with new seed */
u32b seed = time(NULL);
- Rand_Xorshift_init(seed, Rand_state_external);
+ Rand_Xorshift_seed(seed, Rand_state_external);
initialized = TRUE;
}
/**** Available Functions ****/
-extern void Rand_state_init(u32b seed);
+extern void Rand_state_init(void);
+extern void Rand_state_set(u32b seed);
extern void Rand_state_backup(u32b* backup_state);
extern void Rand_state_restore(u32b* backup_state);
extern s32b Rand_div(s32b m);
extern s16b damroll(int num, int sides);
extern s16b maxroll(int num, int sides);
extern s32b div_round(s32b n, s32b d);
-extern u32b Rand_external(u32b m);
+extern s32b Rand_external(s32b m);
#endif