From: matz@... (Yukihiro Matsumoto) Date: 2000-01-06T00:52:46+09:00 Subject: [ruby-talk:01055] Re: rand() / drand48() In message "[ruby-talk:01053] rand() / drand48()" on 00/01/05, ts writes: | If I read it correctly a call to srand48() must be made before any call | to drand48(). | | Apparently in random.c, ruby never check if the initialization function | was called. Can this be a problem for the random generator ? Oops, I haven't noticed that. You're right. Here's the patch. --- /tmp/random.c Thu Jan 6 00:46:39 2000 +++ random.c Thu Jan 6 00:50:51 2000 @@ -83,2 +83,26 @@ +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 @@ -91,3 +115,2 @@ unsigned int seed, old; - static unsigned int saved_seed; @@ -103,16 +126,3 @@ } - -#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); @@ -127,2 +137,10 @@ + static initialized = 0; + + if (first) { + struct timeval tv; + + gettimeofday(&tv, 0); + rand_init(tv.tv_sec ^ tv.tv_usec ^ getpid()); + } switch (TYPE(vmax)) {