diff options
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | random.c | 34 | ||||
-rw-r--r-- | test/ruby/test_rand.rb | 10 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 53 insertions, 9 deletions
@@ -1,3 +1,19 @@ +Wed May 26 13:27:18 2010 Yuki Sonoda (Yugui) <yugui@yugui.jp> + + * random.c: refactoring. + + * random.c (rand_srand): a new function that wraps + rand_init and (re)initialization of the random seed as + a VALUE. + + * random.c (genrand_int32, genrand_real, rb_f_rand, + rb_f_srand): using rand_srand. + +Mon Mar 15 11:49:48 2010 NARUSE, Yui <naruse@ruby-lang.org> + + * random.c (rb_reset_random_seed): set seed in this. + [ruby-core:28655] + Mon Jun 29 20:29:11 2009 Tadayoshi Funaba <tadf@dotrb.org> * rational.c (float_to_r): always returns rational. @@ -205,16 +205,28 @@ struct Random { static struct Random default_mt; +static VALUE rand_init(struct MT *mt, VALUE vseed); +static VALUE random_seed(void); +static VALUE rand_srand(struct Random *rand, VALUE seed); + unsigned long rb_genrand_int32(void) { - return genrand_int32(&default_mt.mt); + struct MT *mt = &default_mt.mt; + if (!genrand_initialized(mt)) { + rand_srand(&default_mt, random_seed()); + } + return genrand_int32(mt); } double rb_genrand_real(void) { - return genrand_real(&default_mt.mt); + struct MT *mt = &default_mt.mt; + if (!genrand_initialized(mt)) { + rand_srand(&default_mt, random_seed()); + } + return genrand_real(mt); } static VALUE @@ -337,6 +349,15 @@ random_seed(void) return make_seed_value(buf); } +static VALUE +rand_srand(struct Random *rand, VALUE seed) +{ + VALUE old = rand->seed.value; + rand->seed.value = rand_init(&rand->mt, seed); + + return old; +} + /* * call-seq: * srand(number=0) => old_seed @@ -354,7 +375,7 @@ random_seed(void) static VALUE rb_f_srand(int argc, VALUE *argv, VALUE obj) { - VALUE seed, old; + VALUE seed; rb_secure(4); if (argc == 0) { @@ -363,10 +384,7 @@ rb_f_srand(int argc, VALUE *argv, VALUE obj) else { rb_scan_args(argc, argv, "01", &seed); } - old = default_mt.seed.value; - default_mt.seed.value = rand_init(&default_mt.mt, seed); - - return old; + return rand_srand(&default_mt, seed); } static unsigned long @@ -481,7 +499,7 @@ rb_f_rand(int argc, VALUE *argv, VALUE obj) rb_scan_args(argc, argv, "01", &vmax); if (!genrand_initialized(mt)) { - rand_init(mt, random_seed()); + rand_srand(&default_mt, random_seed()); } switch (TYPE(vmax)) { case T_FLOAT: diff --git a/test/ruby/test_rand.rb b/test/ruby/test_rand.rb index b7d841dbba..4887377c6d 100644 --- a/test/ruby/test_rand.rb +++ b/test/ruby/test_rand.rb @@ -164,4 +164,14 @@ class TestRand < Test::Unit::TestCase srand(0) assert_equal([1,4,2,5,3], [1,2,3,4,5].shuffle) end + + def test_fork_shuffle + pid = fork do + (1..10).to_a.shuffle + raise 'default seed is not set' if srand == 0 + end + p2, st = Process.waitpid2(pid) + assert(st.success?) + rescue NotImplementedError, ArgumentError + end end @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.1" -#define RUBY_PATCHLEVEL 427 +#define RUBY_PATCHLEVEL 428 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 1 |