• R/O
  • HTTP
  • SSH
  • HTTPS

hengband: Commit

変愚蛮怒のメインリポジトリです


Commit MetaInfo

Revision5c8f6af07740f650f0bf05d144267db86a43bbb4 (tree)
Time2014-03-07 22:38:37
AuthorHabu <habu@user...>
CommiterHabu

Log Message

RNGの初期シードに /dev/urandom を使用するようにした

configureで /dev/urandom の存在をチェックし、存在する場合は使用する。
存在しない場合はこれまでどおりtime()関数などを使用する。

Change Summary

Incremental Difference

--- a/configure.ac
+++ b/configure.ac
@@ -69,6 +69,8 @@ fi
6969
7070 AC_CHECK_LIB(iconv, iconv_open)
7171
72+AC_CHECK_FILE(/dev/urandom, AC_DEFINE(RNG_DEVICE, "/dev/urandom", [Random Number Generation device file]))
73+
7274 dnl Checks for header files.
7375 AC_PATH_XTRA
7476 if test "$have_x" = yes; then
--- a/src/dungeon.c
+++ b/src/dungeon.c
@@ -6889,20 +6889,7 @@ quit("セーブファイルが壊れています");
68896889 /* Init the RNG */
68906890 if (init_random_seed)
68916891 {
6892- u32b seed;
6893-
6894- /* Basic seed */
6895- seed = (time(NULL));
6896-
6897-#ifdef SET_UID
6898-
6899- /* Mutate the seed on Unix machines */
6900- seed = ((seed >> 3) * (getpid() << 1));
6901-
6902-#endif
6903-
6904- /* Seed the RNG */
6905- Rand_state_init(seed);
6892+ Rand_state_init();
69066893 }
69076894
69086895 /* Roll new character */
--- a/src/flavor.c
+++ b/src/flavor.c
@@ -298,7 +298,7 @@ void flavor_init(void)
298298 Rand_state_backup(state_backup);
299299
300300 /* Hack -- Induce consistant flavors */
301- Rand_state_init(seed_flavor);
301+ Rand_state_set(seed_flavor);
302302
303303
304304 /* Initialize flavor index of each object by itself */
--- a/src/wild.c
+++ b/src/wild.c
@@ -234,7 +234,7 @@ static void generate_wilderness_area(int terrain, u32b seed, bool border, bool c
234234 Rand_state_backup(state_backup);
235235
236236 /* Hack -- Induce consistant flavors */
237- Rand_state_init(seed);
237+ Rand_state_set(seed);
238238
239239 if (!corner)
240240 {
@@ -420,7 +420,7 @@ static void generate_area(int y, int x, bool border, bool corner)
420420 Rand_state_backup(state_backup);
421421
422422 /* Hack -- Induce consistant flavors */
423- Rand_state_init(wilderness[y][x].seed);
423+ Rand_state_set(wilderness[y][x].seed);
424424
425425 dy = rand_range(6, cur_hgt - 6);
426426 dx = rand_range(6, cur_wid - 6);
--- a/src/z-rand.c
+++ b/src/z-rand.c
@@ -69,7 +69,7 @@ u32b Rand_state[RAND_DEG] = {
6969 /*
7070 * Initialize Xorshift Algorithm state
7171 */
72-static void Rand_Xorshift_init(u32b seed, u32b* state)
72+static void Rand_Xorshift_seed(u32b seed, u32b* state)
7373 {
7474 int i;
7575
@@ -101,9 +101,35 @@ static const u32b Rand_Xorshift_max = 0xFFFFFFFF;
101101 /*
102102 * Initialize the RNG using a new seed
103103 */
104-void Rand_state_init(u32b seed)
104+void Rand_state_set(u32b seed)
105105 {
106- Rand_Xorshift_init(seed, Rand_state);
106+ Rand_Xorshift_seed(seed, Rand_state);
107+}
108+
109+void Rand_state_init(void)
110+{
111+#ifdef RNG_DEVICE
112+
113+ FILE *fp = fopen(RNG_DEVICE, "r");
114+ u32b buf[4];
115+ do {
116+ fread(buf, sizeof(buf[0]), 4, fp);
117+ } while ((buf[0] | buf[1] | buf[2] | buf[3]) == 0);
118+ memcpy(Rand_state, buf, sizeof(buf));
119+ fclose(fp);
120+
121+#else
122+
123+ /* Basic seed */
124+ u32b seed = (time(NULL));
125+#ifdef SET_UID
126+ /* Mutate the seed on Unix machines */
127+ seed = ((seed >> 3) * (getpid() << 1));
128+#endif
129+ /* Seed the RNG */
130+ Rand_state_set(seed);
131+
132+#endif
107133 }
108134
109135 /*
@@ -336,7 +362,7 @@ s32b div_round(s32b n, s32b d)
336362 *
337363 * Could also use rand() from <stdlib.h> directly. XXX XXX XXX
338364 */
339-u32b Rand_external(u32b m)
365+s32b Rand_external(s32b m)
340366 {
341367 static bool initialized = FALSE;
342368 static u32b Rand_state_external[4];
@@ -345,7 +371,7 @@ u32b Rand_external(u32b m)
345371 {
346372 /* Initialize with new seed */
347373 u32b seed = time(NULL);
348- Rand_Xorshift_init(seed, Rand_state_external);
374+ Rand_Xorshift_seed(seed, Rand_state_external);
349375 initialized = TRUE;
350376 }
351377
--- a/src/z-rand.h
+++ b/src/z-rand.h
@@ -89,7 +89,8 @@ extern u32b Rand_state[RAND_DEG];
8989
9090 /**** Available Functions ****/
9191
92-extern void Rand_state_init(u32b seed);
92+extern void Rand_state_init(void);
93+extern void Rand_state_set(u32b seed);
9394 extern void Rand_state_backup(u32b* backup_state);
9495 extern void Rand_state_restore(u32b* backup_state);
9596 extern s32b Rand_div(s32b m);
@@ -97,7 +98,7 @@ extern s16b randnor(int mean, int stand);
9798 extern s16b damroll(int num, int sides);
9899 extern s16b maxroll(int num, int sides);
99100 extern s32b div_round(s32b n, s32b d);
100-extern u32b Rand_external(u32b m);
101+extern s32b Rand_external(s32b m);
101102
102103
103104 #endif
Show on old repository browser