* random.c (default_rand): removed initial buffer.
* random.c (Init_RandomSeed): initialize seed of default random. * random.c (Init_RandomSeed2): turn the seed to Bignum object. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
01657b51f8
commit
21c7d36573
@ -1,3 +1,11 @@
|
|||||||
|
Mon Mar 15 18:33:36 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* random.c (default_rand): removed initial buffer.
|
||||||
|
|
||||||
|
* random.c (Init_RandomSeed): initialize seed of default random.
|
||||||
|
|
||||||
|
* random.c (Init_RandomSeed2): turn the seed to Bignum object.
|
||||||
|
|
||||||
Mon Mar 15 17:28:30 2010 Yukihiro Matsumoto <matz@ruby-lang.org>
|
Mon Mar 15 17:28:30 2010 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
* io.c (rb_io_print): RDoc update. a patch from Daniel Kelley
|
* io.c (rb_io_print): RDoc update. a patch from Daniel Kelley
|
||||||
|
59
random.c
59
random.c
@ -215,12 +215,7 @@ typedef struct {
|
|||||||
|
|
||||||
#define DEFAULT_SEED_CNT 4
|
#define DEFAULT_SEED_CNT 4
|
||||||
|
|
||||||
struct Random {
|
static rb_random_t default_rand;
|
||||||
rb_random_t rnd;
|
|
||||||
unsigned int initial[DEFAULT_SEED_CNT];
|
|
||||||
};
|
|
||||||
|
|
||||||
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);
|
||||||
@ -228,7 +223,7 @@ static VALUE random_seed(void);
|
|||||||
static struct MT *
|
static struct MT *
|
||||||
default_mt(void)
|
default_mt(void)
|
||||||
{
|
{
|
||||||
rb_random_t *r = &default_rand.rnd;
|
rb_random_t *r = &default_rand;
|
||||||
struct MT *mt = &r->mt;
|
struct MT *mt = &r->mt;
|
||||||
if (!genrand_initialized(mt)) {
|
if (!genrand_initialized(mt)) {
|
||||||
r->seed = rand_init(mt, random_seed());
|
r->seed = rand_init(mt, random_seed());
|
||||||
@ -353,7 +348,7 @@ static VALUE
|
|||||||
random_alloc(VALUE klass)
|
random_alloc(VALUE klass)
|
||||||
{
|
{
|
||||||
rb_random_t *rnd;
|
rb_random_t *rnd;
|
||||||
VALUE obj = TypedData_Make_Struct(rb_cRandom, rb_random_t, &random_data_type, rnd);
|
VALUE obj = TypedData_Make_Struct(klass, rb_random_t, &random_data_type, rnd);
|
||||||
rnd->seed = INT2FIX(0);
|
rnd->seed = INT2FIX(0);
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
@ -601,7 +596,7 @@ random_state(VALUE obj)
|
|||||||
static VALUE
|
static VALUE
|
||||||
random_s_state(VALUE klass)
|
random_s_state(VALUE klass)
|
||||||
{
|
{
|
||||||
return mt_state(&default_rand.rnd.mt);
|
return mt_state(&default_rand.mt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* :nodoc: */
|
/* :nodoc: */
|
||||||
@ -616,7 +611,7 @@ random_left(VALUE obj)
|
|||||||
static VALUE
|
static VALUE
|
||||||
random_s_left(VALUE klass)
|
random_s_left(VALUE klass)
|
||||||
{
|
{
|
||||||
return INT2FIX(default_rand.rnd.mt.left);
|
return INT2FIX(default_rand.mt.left);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* :nodoc: */
|
/* :nodoc: */
|
||||||
@ -739,7 +734,7 @@ static VALUE
|
|||||||
rb_f_srand(int argc, VALUE *argv, VALUE obj)
|
rb_f_srand(int argc, VALUE *argv, VALUE obj)
|
||||||
{
|
{
|
||||||
VALUE seed, old;
|
VALUE seed, old;
|
||||||
struct Random *r = &default_rand;
|
rb_random_t *r = &default_rand;
|
||||||
|
|
||||||
rb_secure(4);
|
rb_secure(4);
|
||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
@ -748,8 +743,8 @@ rb_f_srand(int argc, VALUE *argv, VALUE obj)
|
|||||||
else {
|
else {
|
||||||
rb_scan_args(argc, argv, "01", &seed);
|
rb_scan_args(argc, argv, "01", &seed);
|
||||||
}
|
}
|
||||||
old = r->rnd.seed;
|
old = r->seed;
|
||||||
r->rnd.seed = rand_init(&r->rnd.mt, seed);
|
r->seed = rand_init(&r->mt, seed);
|
||||||
|
|
||||||
return old;
|
return old;
|
||||||
}
|
}
|
||||||
@ -1136,14 +1131,24 @@ rb_f_rand(int argc, VALUE *argv, VALUE obj)
|
|||||||
|
|
||||||
static st_index_t hashseed;
|
static st_index_t hashseed;
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
init_randomseed(struct MT *mt, unsigned int initial[DEFAULT_SEED_CNT])
|
||||||
|
{
|
||||||
|
VALUE seed;
|
||||||
|
fill_random_seed(initial);
|
||||||
|
init_by_array(mt, initial, DEFAULT_SEED_CNT);
|
||||||
|
seed = make_seed_value(initial);
|
||||||
|
memset(initial, 0, DEFAULT_SEED_LEN);
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Init_RandomSeed(void)
|
Init_RandomSeed(void)
|
||||||
{
|
{
|
||||||
struct Random *r = &default_rand;
|
rb_random_t *r = &default_rand;
|
||||||
struct MT *mt = &r->rnd.mt;
|
unsigned int initial[DEFAULT_SEED_CNT];
|
||||||
|
struct MT *mt = &r->mt;
|
||||||
fill_random_seed(r->initial);
|
VALUE seed = init_randomseed(mt, initial);
|
||||||
init_by_array(mt, r->initial, DEFAULT_SEED_CNT);
|
|
||||||
|
|
||||||
hashseed = genrand_int32(mt);
|
hashseed = genrand_int32(mt);
|
||||||
#if SIZEOF_ST_INDEX_T*CHAR_BIT > 4*8
|
#if SIZEOF_ST_INDEX_T*CHAR_BIT > 4*8
|
||||||
@ -1158,6 +1163,9 @@ Init_RandomSeed(void)
|
|||||||
hashseed <<= 32;
|
hashseed <<= 32;
|
||||||
hashseed |= genrand_int32(mt);
|
hashseed |= genrand_int32(mt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
rb_global_variable(&r->seed);
|
||||||
|
r->seed = seed;
|
||||||
}
|
}
|
||||||
|
|
||||||
st_index_t
|
st_index_t
|
||||||
@ -1169,18 +1177,19 @@ rb_hash_start(st_index_t h)
|
|||||||
static void
|
static void
|
||||||
Init_RandomSeed2(void)
|
Init_RandomSeed2(void)
|
||||||
{
|
{
|
||||||
struct Random *r = &default_rand;
|
VALUE seed = default_rand.seed;
|
||||||
rb_global_variable(&r->rnd.seed);
|
|
||||||
r->rnd.seed = make_seed_value(r->initial);
|
if (RB_TYPE_P(seed, T_BIGNUM)) {
|
||||||
memset(r->initial, 0, DEFAULT_SEED_LEN);
|
RBASIC(seed)->klass = rb_cBignum;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_reset_random_seed(void)
|
rb_reset_random_seed(void)
|
||||||
{
|
{
|
||||||
struct Random *r = &default_rand;
|
rb_random_t *r = &default_rand;
|
||||||
uninit_genrand(&r->rnd.mt);
|
uninit_genrand(&r->mt);
|
||||||
r->rnd.seed = INT2FIX(0);
|
r->seed = INT2FIX(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user