diff options
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 48 |
1 files changed, 33 insertions, 15 deletions
@@ -81,6 +81,30 @@ static int first = 1; static char state[256]; #endif +static int +rand_init(seed) + long seed; +{ + int old; + static unsigned int saved_seed; + +#ifdef HAVE_RANDOM + if (first == 1) { + initstate(1, state, sizeof state); + first = 0; + } + else { + setstate(state); + } +#endif + + SRANDOM(seed); + old = saved_seed; + saved_seed = seed; + + return old; +} + static VALUE rb_f_srand(argc, argv, obj) int argc; @@ -89,7 +113,6 @@ rb_f_srand(argc, argv, obj) { VALUE a; unsigned int seed, old; - static unsigned int saved_seed; if (rb_scan_args(argc, argv, "01", &a) == 0) { static int n = 0; @@ -101,20 +124,7 @@ rb_f_srand(argc, argv, obj) else { seed = NUM2UINT(a); } - -#ifdef HAVE_RANDOM - if (first == 1) { - initstate(1, state, sizeof state); - first = 0; - } - else { - setstate(state); - } -#endif - - SRANDOM(seed); - old = saved_seed; - saved_seed = seed; + old = rand_init(seed); return rb_uint2inum(old); } @@ -125,6 +135,14 @@ rb_f_rand(obj, vmax) { long val, max; + static initialized = 0; + + if (first) { + struct timeval tv; + + gettimeofday(&tv, 0); + rand_init(tv.tv_sec ^ tv.tv_usec ^ getpid()); + } switch (TYPE(vmax)) { case T_FLOAT: if (RFLOAT(vmax)->value <= LONG_MAX && RFLOAT(vmax)->value >= LONG_MIN) |