From: Habu Date: Fri, 7 Mar 2014 13:38:37 +0000 (+0900) Subject: RNGの初期シードに /dev/urandom を使用するようにした X-Git-Tag: v2.2.0~277^2~1 X-Git-Url: http://git.osdn.net/view?p=hengband%2Fhengband.git;a=commitdiff_plain;h=5c8f6af07740f650f0bf05d144267db86a43bbb4 RNGの初期シードに /dev/urandom を使用するようにした configureで /dev/urandom の存在をチェックし、存在する場合は使用する。 存在しない場合はこれまでどおりtime()関数などを使用する。 --- diff --git a/configure.ac b/configure.ac index e7fc64048..9a1dd6501 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/src/dungeon.c b/src/dungeon.c index 29e505d04..5fb2651d9 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -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 */ diff --git a/src/flavor.c b/src/flavor.c index 2f68f04a5..83f4c2122 100644 --- a/src/flavor.c +++ b/src/flavor.c @@ -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 */ diff --git a/src/wild.c b/src/wild.c index dc5696d02..dbf693d24 100644 --- 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 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); diff --git a/src/z-rand.c b/src/z-rand.c index 3dbdcb280..fbdd462c1 100644 --- a/src/z-rand.c +++ b/src/z-rand.c @@ -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 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; } diff --git a/src/z-rand.h b/src/z-rand.h index bdc37dc6a..a002d18b9 100644 --- a/src/z-rand.h +++ b/src/z-rand.h @@ -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