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

* array.c (rb_ary_sample): rename #choice to #sample. in

addition, sample takes optional argument, a la #first.

* random.c (Init_Random): always initialize seed.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@18509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2008-08-12 05:08:52 +00:00
parent aadf534bb3
commit e65c07e98b
3 changed files with 46 additions and 14 deletions

View file

@ -4,6 +4,13 @@ Tue Aug 12 13:57:11 2008 Akinori MUSHA <knu@iDaemons.org>
regexp to only pick definition lines properly. `module_funtion'
is not a definition of a module named `_function'.
Tue Aug 12 11:19:32 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* array.c (rb_ary_sample): rename #choice to #sample. in
addition, sample takes optional argument, a la #first.
* random.c (Init_Random): always initialize seed.
Mon Aug 11 14:39:46 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* class.c (clone_method): should copy cbase in cref as well.

47
array.c
View file

@ -3301,22 +3301,51 @@ rb_ary_shuffle(VALUE ary)
/*
* call-seq:
* array.choice -> obj
* array.sample -> obj
* array.sample(n) -> an_array
*
* Choose a random element, or the random +n+ elements, fron the array.
* If the array is empty, the first form returns <code>nil</code>, and the
* second form returns an empty array.
*
* Choose a random element from an array.
*/
static VALUE
rb_ary_choice(ary)
rb_ary_sample(argc, argv, ary)
int argc;
VALUE *argv;
VALUE ary;
{
long i, j;
VALUE nv, result;
int n, len, i, j;
i = RARRAY(ary)->len;
if (i == 0) return Qnil;
j = rb_genrand_real()*i;
return RARRAY(ary)->ptr[j];
len = RARRAY_LEN(ary);
if (argc == 0) {
if (len == 0) return Qnil;
i = rb_genrand_real()*len;
return RARRAY_PTR(ary)[i];
}
rb_scan_args(argc, argv, "1", &nv);
if (len == 0) return rb_ary_new2(0);
n = NUM2INT(nv);
result = rb_ary_new2(n);
for (i=0; i<n; i++) {
retry:
j = rb_genrand_real()*len;
nv = LONG2NUM(j);
for (j=0; j<i; j++) {
if (RARRAY_PTR(result)[j] == nv)
goto retry;
}
RARRAY_PTR(result)[i] = nv;
RARRAY(result)->len = i+1;
}
for (i=0; i<n; i++) {
nv = RARRAY_PTR(result)[i];
RARRAY_PTR(result)[i] = RARRAY_PTR(ary)[NUM2LONG(nv)];
}
return result;
}
@ -3852,7 +3881,7 @@ Init_Array()
rb_define_method(rb_cArray, "count", rb_ary_count, -1);
rb_define_method(rb_cArray, "shuffle!", rb_ary_shuffle_bang, 0);
rb_define_method(rb_cArray, "shuffle", rb_ary_shuffle, 0);
rb_define_method(rb_cArray, "choice", rb_ary_choice, 0);
rb_define_method(rb_cArray, "sample", rb_ary_sample, -1);
rb_define_method(rb_cArray, "cycle", rb_ary_cycle, -1);
rb_define_method(rb_cArray, "permutation", rb_ary_permutation, -1);
rb_define_method(rb_cArray, "combination", rb_ary_combination, 1);

View file

@ -189,7 +189,6 @@ rb_genrand_real(void)
#include <fcntl.h>
#endif
static int first = 1;
static VALUE saved_seed = INT2FIX(0);
static VALUE
@ -245,7 +244,6 @@ rand_init(vseed)
len--;
init_by_array(buf, len);
}
first = 0;
old = saved_seed;
saved_seed = seed;
free(buf);
@ -445,9 +443,6 @@ rb_f_rand(argc, argv, obj)
long val, max;
rb_scan_args(argc, argv, "01", &vmax);
if (first) {
rand_init(random_seed());
}
switch (TYPE(vmax)) {
case T_FLOAT:
if (RFLOAT(vmax)->value <= LONG_MAX && RFLOAT(vmax)->value >= LONG_MIN) {
@ -498,6 +493,7 @@ rb_f_rand(argc, argv, obj)
void
Init_Random()
{
rand_init(random_seed());
rb_define_global_function("srand", rb_f_srand, -1);
rb_define_global_function("rand", rb_f_rand, -1);
rb_global_variable(&saved_seed);