diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-01-17 08:24:22 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-01-17 08:24:22 +0000 |
commit | 3b992de6c0c96f0dcf8931c1f0baa561f9b9538a (patch) | |
tree | ffe44e7d3725919c2d14e3addcf98eaea957710b /random.c | |
parent | 037b710e18fe1101428ef235ec80b831c1e0d081 (diff) |
2000-01-17
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_4@605 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'random.c')
-rw-r--r-- | random.c | 50 |
1 files changed, 34 insertions, 16 deletions
@@ -6,7 +6,7 @@ $Date$ created at: Fri Dec 24 16:39:21 JST 1993 - Copyright (C) 1993-1999 Yukihiro Matsumoto + Copyright (C) 1993-2000 Yukihiro Matsumoto ************************************************/ @@ -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) |