summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-01 07:59:03 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-01 07:59:03 +0000
commit237fc688394b84ec286572995d393b709d4987d6 (patch)
tree5c15be668195fc04c9b69a24830127b79f5cb80e
parent58a4828163a15e496410b0803866f1b80c7545a4 (diff)
merges r26936 from trunk into ruby_1_9_1 and little refactoring.
-- * random.c (rb_reset_random_seed): set seed in this. [ruby-core:28655] -- * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@28511 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog16
-rw-r--r--random.c34
-rw-r--r--test/ruby/test_rand.rb10
-rw-r--r--version.h2
4 files changed, 53 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index db60ab1d5a..78032569d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/random.c b/random.c
index 6fded25ce2..e1d6b65b1c 100644
--- a/random.c
+++ b/random.c
@@ -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
diff --git a/version.h b/version.h
index fc516589d3..8e4f94ce2c 100644
--- a/version.h
+++ b/version.h
@@ -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