OSDN Git Service

RNGの初期シードに /dev/urandom を使用するようにした
authorHabu <habu@users.sourceforge.jp>
Fri, 7 Mar 2014 13:38:37 +0000 (22:38 +0900)
committerHabu <habu@users.sourceforge.jp>
Fri, 7 Mar 2014 13:38:37 +0000 (22:38 +0900)
configureで /dev/urandom の存在をチェックし、存在する場合は使用する。
存在しない場合はこれまでどおりtime()関数などを使用する。

configure.ac
src/dungeon.c
src/flavor.c
src/wild.c
src/z-rand.c
src/z-rand.h

index e7fc640..9a1dd65 100644 (file)
@@ -69,6 +69,8 @@ fi
 
 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
index 29e505d..5fb2651 100644 (file)
@@ -6889,20 +6889,7 @@ quit("セーブファイルが壊れています");
        /* 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 */
index 2f68f04..83f4c21 100644 (file)
@@ -298,7 +298,7 @@ void flavor_init(void)
        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 */
index dc5696d..dbf693d 100644 (file)
@@ -234,7 +234,7 @@ static void generate_wilderness_area(int terrain, u32b seed, bool border, bool c
        Rand_state_backup(state_backup);
 
        /* Hack -- Induce consistant flavors */
-       Rand_state_init(seed);
+       Rand_state_set(seed);
 
        if (!corner)
        {
@@ -420,7 +420,7 @@ static void generate_area(int y, int x, bool border, bool 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);
index 3dbdcb2..fbdd462 100644 (file)
@@ -69,7 +69,7 @@ u32b Rand_state[RAND_DEG] = {
 /*
  * Initialize Xorshift Algorithm state
  */
-static void Rand_Xorshift_init(u32b seed, u32b* state)
+static void Rand_Xorshift_seed(u32b seed, u32b* state)
 {
        int i;
 
@@ -101,9 +101,35 @@ static const u32b Rand_Xorshift_max = 0xFFFFFFFF;
 /*
  * 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
 }
 
 /*
@@ -336,7 +362,7 @@ s32b div_round(s32b n, s32b d)
  *
  * 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];
@@ -345,7 +371,7 @@ u32b Rand_external(u32b m)
        {
                /* Initialize with new seed */
                u32b seed = time(NULL);
-               Rand_Xorshift_init(seed, Rand_state_external);
+               Rand_Xorshift_seed(seed, Rand_state_external);
                initialized = TRUE;
        }
 
index bdc37dc..a002d18 100644 (file)
@@ -89,7 +89,8 @@ extern u32b Rand_state[RAND_DEG];
 
 /**** 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);
@@ -97,7 +98,7 @@ extern s16b randnor(int mean, int stand);
 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