Bug #13136 » rb_ary_sample.patch
array.c | ||
---|---|---|
VALUE opts, randgen = rb_cRandom;
|
||
long n, len, i, j, k, idx[10];
|
||
long rnds[numberof(idx)];
|
||
long memo_threshold;
|
||
if (OPTHASH_GIVEN_P(opts)) {
|
||
VALUE rnd;
|
||
... | ... | |
}
|
||
return rb_ary_new_from_args(3, RARRAY_AREF(ary, i), RARRAY_AREF(ary, j), RARRAY_AREF(ary, k));
|
||
}
|
||
memo_threshold = len < 2560 ? len / 128 : len < 5120 ? len / 64 : len < 10240 ? len / 32 : len / 16;
|
||
if (n <= numberof(idx)) {
|
||
long sorted[numberof(idx)];
|
||
sorted[0] = idx[0] = rnds[0];
|
||
... | ... | |
}
|
||
});
|
||
}
|
||
else if (n <= memo_threshold) {
|
||
st_table *table = st_init_numtable_with_size(n);
|
||
long i2, j2;
|
||
st_data_t value;
|
||
result = rb_ary_new_capa(n);
|
||
RARRAY_PTR_USE(ary, ptr_ary, {
|
||
RARRAY_PTR_USE(result, ptr_result, {
|
||
for (i=0; i<n; i++){
|
||
j2 = j = RAND_UPTO(len-i) + i;
|
||
i2 = i;
|
||
if (st_lookup(table, (st_data_t)i, &value)) i2 = value;
|
||
if (st_lookup(table, (st_data_t)j, &value)) j2 = value;
|
||
st_insert(table, (st_data_t)j, (st_data_t)i2);
|
||
ptr_result[i] = ptr_ary[j2];
|
||
}
|
||
});
|
||
});
|
||
st_free_table(table);
|
||
}
|
||
else {
|
||
result = rb_ary_dup(ary);
|
||
RBASIC_CLEAR_CLASS(result);
|