From ee08592d029fdb8fcaab6eafded3d5bc22804d41 Mon Sep 17 00:00:00 2001 From: matz Date: Sat, 8 Jan 2000 05:00:25 +0000 Subject: 2000-01-08 git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@601 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- random.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) (limited to 'random.c') diff --git a/random.c b/random.c index 62d300af5..e8c9d1cb2 100644 --- a/random.c +++ b/random.c @@ -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) -- cgit