diff --git a/ChangeLog b/ChangeLog index 4f0131cf58..246514f080 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Jul 18 09:16:18 2009 Nobuyoshi Nakada + + * random.c (rb_random_{int32,real,bytes,int}): added functions for + extension libraries. + Sat Jul 18 09:07:00 2009 Nobuyoshi Nakada * random.c (fill_random_seed): use cryptographic service on Windows. diff --git a/include/ruby/intern.h b/include/ruby/intern.h index 7375442b41..4418806a6b 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -524,9 +524,13 @@ VALUE rb_range_new(VALUE, VALUE, int); VALUE rb_range_beg_len(VALUE, long*, long*, long, int); int rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp); /* random.c */ -unsigned long rb_genrand_int32(void); +unsigned int rb_genrand_int32(void); double rb_genrand_real(void); void rb_reset_random_seed(void); +VALUE rb_random_bytes(VALUE rnd, long n); +VALUE rb_random_int(VALUE rnd, VALUE max); +unsigned int rb_random_int32(VALUE rnd); +double rb_random_real(VALUE rnd); /* re.c */ #define rb_memcmp memcmp int rb_memcicmp(const void*,const void*,long); diff --git a/random.c b/random.c index 57ab673831..ceec247fa1 100644 --- a/random.c +++ b/random.c @@ -211,7 +211,7 @@ struct Random { static struct Random default_rand; -unsigned long +unsigned int rb_genrand_int32(void) { return genrand_int32(&default_rand.rnd.mt); @@ -767,6 +767,20 @@ rb_rand_internal(unsigned long i) return limited_rand(mt, i); } +unsigned int +rb_random_int32(VALUE obj) +{ + rb_random_t *rnd = get_rnd(obj); + return genrand_int32(&rnd->mt); +} + +double +rb_random_real(VALUE obj) +{ + rb_random_t *rnd = get_rnd(obj); + return genrand_real(&rnd->mt); +} + /* * call-seq: prng.bytes(size) -> prng * @@ -775,9 +789,14 @@ rb_rand_internal(unsigned long i) */ static VALUE random_bytes(VALUE obj, VALUE len) +{ + return rb_random_bytes(obj, FIX2LONG(rb_to_int(len))); +} + +VALUE +rb_random_bytes(VALUE obj, long n) { rb_random_t *rnd = get_rnd(obj); - long n = FIX2LONG(rb_to_int(len)); VALUE bytes = rb_str_new(0, n); char *ptr = RSTRING_PTR(bytes); unsigned int r, i; @@ -868,8 +887,8 @@ rand_int(struct MT *mt, VALUE vmax) * * Otherwise, it raises an ArgumentError. */ -static VALUE -random_int(VALUE obj, VALUE vmax) +VALUE +rb_random_int(VALUE obj, VALUE vmax) { VALUE v, beg = Qundef; rb_random_t *rnd = get_rnd(obj); @@ -887,6 +906,8 @@ random_int(VALUE obj, VALUE vmax) return add_to_begin(beg, v); } +#define random_int rb_random_int + /* * call-seq: * prng.float -> float