1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* random.c (next_state): no initialization here.

* random.c (default_mt): always return initialized MT.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26937 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2010-03-15 05:06:11 +00:00
parent 1bf3ca494f
commit d188e1a852
2 changed files with 23 additions and 23 deletions

View file

@ -1,3 +1,9 @@
Mon Mar 15 14:06:07 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* random.c (next_state): no initialization here.
* random.c (default_mt): always return initialized MT.
Mon Mar 15 11:49:48 2010 NARUSE, Yui <naruse@ruby-lang.org> Mon Mar 15 11:49:48 2010 NARUSE, Yui <naruse@ruby-lang.org>
* random.c (rb_reset_random_seed): set seed in this. * random.c (rb_reset_random_seed): set seed in this.

View file

@ -137,10 +137,6 @@ next_state(struct MT *mt)
unsigned int *p = mt->state; unsigned int *p = mt->state;
int j; int j;
/* if init_genrand() has not been called, */
/* a default initial seed is used */
if (!genrand_initialized(mt)) init_genrand(mt, 5489U);
mt->left = N; mt->left = N;
mt->next = mt->state; mt->next = mt->state;
@ -157,6 +153,7 @@ next_state(struct MT *mt)
static unsigned int static unsigned int
genrand_int32(struct MT *mt) genrand_int32(struct MT *mt)
{ {
/* mt must be initialized */
unsigned int y; unsigned int y;
if (--mt->left <= 0) next_state(mt); if (--mt->left <= 0) next_state(mt);
@ -175,6 +172,7 @@ genrand_int32(struct MT *mt)
static double static double
genrand_real(struct MT *mt) genrand_real(struct MT *mt)
{ {
/* mt must be initialized */
unsigned int a = genrand_int32(mt)>>5, b = genrand_int32(mt)>>6; unsigned int a = genrand_int32(mt)>>5, b = genrand_int32(mt)>>6;
return(a*67108864.0+b)*(1.0/9007199254740992.0); return(a*67108864.0+b)*(1.0/9007199254740992.0);
} }
@ -184,6 +182,7 @@ static double int_pair_to_real_inclusive(unsigned int a, unsigned int b);
static double static double
genrand_real2(struct MT *mt) genrand_real2(struct MT *mt)
{ {
/* mt must be initialized */
unsigned int a = genrand_int32(mt), b = genrand_int32(mt); unsigned int a = genrand_int32(mt), b = genrand_int32(mt);
return int_pair_to_real_inclusive(a, b); return int_pair_to_real_inclusive(a, b);
} }
@ -226,30 +225,28 @@ static struct Random default_rand;
static VALUE rand_init(struct MT *mt, VALUE vseed); static VALUE rand_init(struct MT *mt, VALUE vseed);
static VALUE random_seed(void); static VALUE random_seed(void);
static void static struct MT *
default_rand_init(void) default_mt(void)
{ {
rb_random_t *r = &default_rand.rnd; rb_random_t *r = &default_rand.rnd;
r->seed = rand_init(&r->mt, random_seed()); struct MT *mt = &r->mt;
if (!genrand_initialized(mt)) {
r->seed = rand_init(mt, random_seed());
}
return mt;
} }
unsigned int unsigned int
rb_genrand_int32(void) rb_genrand_int32(void)
{ {
struct MT *mt = &default_rand.rnd.mt; struct MT *mt = default_mt();
if (!genrand_initialized(mt)) {
default_rand_init();
}
return genrand_int32(mt); return genrand_int32(mt);
} }
double double
rb_genrand_real(void) rb_genrand_real(void)
{ {
struct MT *mt = &default_rand.rnd.mt; struct MT *mt = default_mt();
if (!genrand_initialized(mt)) {
default_rand_init();
}
return genrand_real(mt); return genrand_real(mt);
} }
@ -774,6 +771,7 @@ make_mask(unsigned long x)
static unsigned long static unsigned long
limited_rand(struct MT *mt, unsigned long limit) limited_rand(struct MT *mt, unsigned long limit)
{ {
/* mt must be initialized */
int i; int i;
unsigned long val, mask; unsigned long val, mask;
@ -795,6 +793,7 @@ limited_rand(struct MT *mt, unsigned long limit)
static VALUE static VALUE
limited_big_rand(struct MT *mt, struct RBignum *limit) limited_big_rand(struct MT *mt, struct RBignum *limit)
{ {
/* mt must be initialized */
unsigned long mask, lim, rnd; unsigned long mask, lim, rnd;
struct RBignum *val; struct RBignum *val;
long i, len; long i, len;
@ -845,10 +844,7 @@ limited_big_rand(struct MT *mt, struct RBignum *limit)
unsigned long unsigned long
rb_rand_internal(unsigned long i) rb_rand_internal(unsigned long i)
{ {
struct MT *mt = &default_rand.rnd.mt; struct MT *mt = default_mt();
if (!genrand_initialized(mt)) {
default_rand_init();
}
return limited_rand(mt, i); return limited_rand(mt, i);
} }
@ -919,6 +915,7 @@ range_values(VALUE vmax, VALUE *begp, int *exclp)
static VALUE static VALUE
rand_int(struct MT *mt, VALUE vmax, int restrictive) rand_int(struct MT *mt, VALUE vmax, int restrictive)
{ {
/* mt must be initialized */
long max; long max;
unsigned long r; unsigned long r;
@ -1124,11 +1121,8 @@ static VALUE
rb_f_rand(int argc, VALUE *argv, VALUE obj) rb_f_rand(int argc, VALUE *argv, VALUE obj)
{ {
VALUE vmax, r; VALUE vmax, r;
struct MT *mt = &default_rand.rnd.mt; struct MT *mt = default_mt();
if (!genrand_initialized(mt)) {
default_rand_init();
}
if (argc == 0) goto zero_arg; if (argc == 0) goto zero_arg;
rb_scan_args(argc, argv, "01", &vmax); rb_scan_args(argc, argv, "01", &vmax);
if (NIL_P(vmax)) goto zero_arg; if (NIL_P(vmax)) goto zero_arg;