変愚蛮怒のメインリポジトリです
Revision | 5c8f6af07740f650f0bf05d144267db86a43bbb4 (tree) |
---|---|
Time | 2014-03-07 22:38:37 |
Author | Habu <habu@user...> |
Commiter | Habu |
RNGの初期シードに /dev/urandom を使用するようにした
configureで /dev/urandom の存在をチェックし、存在する場合は使用する。
存在しない場合はこれまでどおりtime()関数などを使用する。
@@ -69,6 +69,8 @@ fi | ||
69 | 69 | |
70 | 70 | AC_CHECK_LIB(iconv, iconv_open) |
71 | 71 | |
72 | +AC_CHECK_FILE(/dev/urandom, AC_DEFINE(RNG_DEVICE, "/dev/urandom", [Random Number Generation device file])) | |
73 | + | |
72 | 74 | dnl Checks for header files. |
73 | 75 | AC_PATH_XTRA |
74 | 76 | if test "$have_x" = yes; then |
@@ -6889,20 +6889,7 @@ quit("セーブファイルが壊れています"); | ||
6889 | 6889 | /* Init the RNG */ |
6890 | 6890 | if (init_random_seed) |
6891 | 6891 | { |
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(); | |
6906 | 6893 | } |
6907 | 6894 | |
6908 | 6895 | /* Roll new character */ |
@@ -298,7 +298,7 @@ void flavor_init(void) | ||
298 | 298 | Rand_state_backup(state_backup); |
299 | 299 | |
300 | 300 | /* Hack -- Induce consistant flavors */ |
301 | - Rand_state_init(seed_flavor); | |
301 | + Rand_state_set(seed_flavor); | |
302 | 302 | |
303 | 303 | |
304 | 304 | /* Initialize flavor index of each object by itself */ |
@@ -234,7 +234,7 @@ static void generate_wilderness_area(int terrain, u32b seed, bool border, bool c | ||
234 | 234 | Rand_state_backup(state_backup); |
235 | 235 | |
236 | 236 | /* Hack -- Induce consistant flavors */ |
237 | - Rand_state_init(seed); | |
237 | + Rand_state_set(seed); | |
238 | 238 | |
239 | 239 | if (!corner) |
240 | 240 | { |
@@ -420,7 +420,7 @@ static void generate_area(int y, int x, bool border, bool corner) | ||
420 | 420 | Rand_state_backup(state_backup); |
421 | 421 | |
422 | 422 | /* Hack -- Induce consistant flavors */ |
423 | - Rand_state_init(wilderness[y][x].seed); | |
423 | + Rand_state_set(wilderness[y][x].seed); | |
424 | 424 | |
425 | 425 | dy = rand_range(6, cur_hgt - 6); |
426 | 426 | dx = rand_range(6, cur_wid - 6); |
@@ -69,7 +69,7 @@ u32b Rand_state[RAND_DEG] = { | ||
69 | 69 | /* |
70 | 70 | * Initialize Xorshift Algorithm state |
71 | 71 | */ |
72 | -static void Rand_Xorshift_init(u32b seed, u32b* state) | |
72 | +static void Rand_Xorshift_seed(u32b seed, u32b* state) | |
73 | 73 | { |
74 | 74 | int i; |
75 | 75 |
@@ -101,9 +101,35 @@ static const u32b Rand_Xorshift_max = 0xFFFFFFFF; | ||
101 | 101 | /* |
102 | 102 | * Initialize the RNG using a new seed |
103 | 103 | */ |
104 | -void Rand_state_init(u32b seed) | |
104 | +void Rand_state_set(u32b seed) | |
105 | 105 | { |
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 | |
107 | 133 | } |
108 | 134 | |
109 | 135 | /* |
@@ -336,7 +362,7 @@ s32b div_round(s32b n, s32b d) | ||
336 | 362 | * |
337 | 363 | * Could also use rand() from <stdlib.h> directly. XXX XXX XXX |
338 | 364 | */ |
339 | -u32b Rand_external(u32b m) | |
365 | +s32b Rand_external(s32b m) | |
340 | 366 | { |
341 | 367 | static bool initialized = FALSE; |
342 | 368 | static u32b Rand_state_external[4]; |
@@ -345,7 +371,7 @@ u32b Rand_external(u32b m) | ||
345 | 371 | { |
346 | 372 | /* Initialize with new seed */ |
347 | 373 | u32b seed = time(NULL); |
348 | - Rand_Xorshift_init(seed, Rand_state_external); | |
374 | + Rand_Xorshift_seed(seed, Rand_state_external); | |
349 | 375 | initialized = TRUE; |
350 | 376 | } |
351 | 377 |
@@ -89,7 +89,8 @@ extern u32b Rand_state[RAND_DEG]; | ||
89 | 89 | |
90 | 90 | /**** Available Functions ****/ |
91 | 91 | |
92 | -extern void Rand_state_init(u32b seed); | |
92 | +extern void Rand_state_init(void); | |
93 | +extern void Rand_state_set(u32b seed); | |
93 | 94 | extern void Rand_state_backup(u32b* backup_state); |
94 | 95 | extern void Rand_state_restore(u32b* backup_state); |
95 | 96 | extern s32b Rand_div(s32b m); |
@@ -97,7 +98,7 @@ extern s16b randnor(int mean, int stand); | ||
97 | 98 | extern s16b damroll(int num, int sides); |
98 | 99 | extern s16b maxroll(int num, int sides); |
99 | 100 | extern s32b div_round(s32b n, s32b d); |
100 | -extern u32b Rand_external(u32b m); | |
101 | +extern s32b Rand_external(s32b m); | |
101 | 102 | |
102 | 103 | |
103 | 104 | #endif |