summaryrefslogtreecommitdiff
path: root/random.c
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 /random.c
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
Diffstat (limited to 'random.c')
-rw-r--r--random.c34
1 files changed, 26 insertions, 8 deletions
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: