Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 16,22c16
- < #define GLOBAL_RAND_SEED_KEY "$mrb_g_rand_seed"
- < #define GLOBAL_RAND_SEED_KEY_CSTR_LEN 16
- <
- < #define INSTANCE_RAND_SEED_KEY "$mrb_i_rand_seed"
- < #define INSTANCE_RAND_SEED_KEY_CSTR_LEN 16
- <
- < #define MT_STATE_KEY "$mrb_i_mt_state"
- ---
- > static char const MT_STATE_KEY[] = "$mrb_i_mt_state";
- 28,41c22,23
- < static void mt_g_srand(unsigned long seed)
- < {
- < init_genrand(seed);
- < }
- <
- < static unsigned long mt_g_rand()
- < {
- < return genrand_int32();
- < }
- <
- < static double mt_g_rand_real()
- < {
- < return genrand_real1();
- < }
- ---
- > static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self);
- > static mrb_value mrb_random_srand(mrb_state *mrb, mrb_value self);
- 43,73c25
- < static mrb_value
- < mrb_random_mt_g_srand(mrb_state *mrb, mrb_value seed)
- < {
- < if (mrb_nil_p(seed)) {
- < seed = mrb_fixnum_value(time(NULL) + mt_g_rand());
- < if (mrb_fixnum(seed) < 0) {
- < seed = mrb_fixnum_value( 0 - mrb_fixnum(seed));
- < }
- < }
- <
- < mt_g_srand((unsigned) mrb_fixnum(seed));
- <
- < return seed;
- < }
- <
- < static mrb_value
- < mrb_random_mt_g_rand(mrb_state *mrb, mrb_value max)
- < {
- < mrb_value value;
- <
- < if (mrb_fixnum(max) == 0) {
- < value = mrb_float_value(mrb, mt_g_rand_real());
- < }
- < else {
- < value = mrb_fixnum_value(mt_g_rand() % mrb_fixnum(max));
- < }
- <
- < return value;
- < }
- <
- < static void
- ---
- > static void
- 77c29
- < }
- ---
- > }
- 79c31
- < static unsigned long
- ---
- > static unsigned long
- 83c35
- < }
- ---
- > }
- 85c37
- < static double
- ---
- > static double
- 89c41
- < }
- ---
- > }
- 91c43
- < static mrb_value
- ---
- > static mrb_value
- 93c45
- < {
- ---
- > {
- 95c47
- < seed = mrb_fixnum_value(time(NULL) + mt_rand(t));
- ---
- > seed = mrb_fixnum_value((mrb_int)(time(NULL) + mt_rand(t)));
- 97c49
- < seed = mrb_fixnum_value( 0 - mrb_fixnum(seed));
- ---
- > seed = mrb_fixnum_value(0 - mrb_fixnum(seed));
- 106c58
- < static mrb_value
- ---
- > static mrb_value
- 108c60
- < {
- ---
- > {
- 121c73
- < static mrb_value
- ---
- > static mrb_value
- 126c78
- < arg = mrb_fixnum_value(0);
- ---
- > arg = mrb_nil_value();
- 141,142c93,101
- < static void
- < mrb_random_g_rand_seed(mrb_state *mrb)
- ---
- > static mrb_value
- > get_random(mrb_state *mrb) {
- > return mrb_const_get(mrb,
- > mrb_obj_value(mrb_class_get(mrb, "Random")),
- > mrb_intern_lit(mrb, "DEFAULT"));
- > }
- >
- > static mt_state *
- > get_random_state(mrb_state *mrb)
- 144,149c103,104
- < mrb_value seed;
- <
- < seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
- < if (mrb_nil_p(seed)) {
- < mrb_random_mt_g_srand(mrb, mrb_nil_value());
- < }
- ---
- > mrb_value random_val = get_random(mrb);
- > return DATA_GET_PTR(mrb, random_val, &mt_state_type, mt_state);
- 152c107
- < static mrb_value
- ---
- > static mrb_value
- 155,159c110,111
- < mrb_value max;
- <
- < max = get_opt(mrb);
- < mrb_random_g_rand_seed(mrb);
- < return mrb_random_mt_g_rand(mrb, max);
- ---
- > mrb_value random = get_random(mrb);
- > return mrb_random_rand(mrb, random);
- 162c114
- < static mrb_value
- ---
- > static mrb_value
- 165,172c117,118
- < mrb_value seed;
- < mrb_value old_seed;
- <
- < seed = get_opt(mrb);
- < seed = mrb_random_mt_g_srand(mrb, seed);
- < old_seed = mrb_gv_get(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN));
- < mrb_gv_set(mrb, mrb_intern(mrb, GLOBAL_RAND_SEED_KEY, GLOBAL_RAND_SEED_KEY_CSTR_LEN), seed);
- < return old_seed;
- ---
- > mrb_value random = get_random(mrb);
- > return mrb_random_srand(mrb, random);
- 175c121
- < static mrb_value
- ---
- > static mrb_value
- 180,183c126
- <
- < DATA_TYPE(self) = &mt_state_type;
- < DATA_PTR(self) = NULL;
- <
- ---
- >
- 188c131,132
- < }
- ---
- > }
- > mrb_data_init(self, NULL, &mt_state_type);
- 195,198c139,149
- < mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
- <
- < DATA_PTR(self) = t;
- <
- ---
- > if (mrb_nil_p(seed)) {
- > t->has_seed = FALSE;
- > }
- > else {
- > mrb_assert(mrb_fixnum_p(seed));
- > t->has_seed = TRUE;
- > t->seed = mrb_fixnum(seed);
- > }
- >
- > mrb_data_init(self, t, &mt_state_type);
- >
- 202,203c153,154
- < static void
- < mrb_random_rand_seed(mrb_state *mrb, mrb_value self)
- ---
- > static void
- > mrb_random_rand_seed(mrb_state *mrb, mt_state *t)
- 205,209c156
- < mrb_value seed;
- < mt_state *t = DATA_PTR(self);
- <
- < seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
- < if (mrb_nil_p(seed)) {
- ---
- > if (!t->has_seed) {
- 214c161
- < static mrb_value
- ---
- > static mrb_value
- 218c165
- < mt_state *t = DATA_PTR(self);
- ---
- > mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);
- 221c168
- < mrb_random_rand_seed(mrb, self);
- ---
- > mrb_random_rand_seed(mrb, t);
- 225c172
- < static mrb_value
- ---
- > static mrb_value
- 230c177
- < mt_state *t = DATA_PTR(self);
- ---
- > mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);
- 234,235c181,189
- < old_seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
- < mrb_iv_set(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN), seed);
- ---
- > old_seed = t->has_seed? mrb_fixnum_value(t->seed) : mrb_nil_value();
- > if (mrb_nil_p(seed)) {
- > t->has_seed = FALSE;
- > }
- > else {
- > mrb_assert(mrb_fixnum_p(seed));
- > t->has_seed = TRUE;
- > t->seed = mrb_fixnum(seed);
- > }
- 251,252c205,206
- < mrb_value random = mrb_nil_value();
- <
- ---
- > mt_state *random = NULL;
- >
- 254c208
- < mrb_get_args(mrb, "|o", &random);
- ---
- > mrb_get_args(mrb, "|d", &random, &mt_state_type);
- 256,261c210,211
- < if (mrb_nil_p(random)) {
- < mrb_random_g_rand_seed(mrb);
- < }
- < else {
- < mrb_data_check_type(mrb, random, &mt_state_type);
- < mrb_random_rand_seed(mrb, random);
- ---
- > if (random == NULL) {
- > random = get_random_state(mrb);
- 263c213,214
- <
- ---
- > mrb_random_rand_seed(mrb, random);
- >
- 265c216
- <
- ---
- >
- 269,276c220,222
- <
- < if (mrb_nil_p(random)) {
- < j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary))));
- < }
- < else {
- < j = mrb_fixnum(mrb_random_mt_rand(mrb, DATA_PTR(random), mrb_fixnum_value(RARRAY_LEN(ary))));
- < }
- <
- ---
- >
- > j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary))));
- >
- 278,280c224,226
- < RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
- < RARRAY_PTR(ary)[j] = tmp;
- < }
- ---
- > mrb_ary_ptr(ary)->ptr[i] = RARRAY_PTR(ary)[j];
- > mrb_ary_ptr(ary)->ptr[j] = tmp;
- > }
- 282c228
- <
- ---
- >
- 298c244
- <
- ---
- >
- 301a248,317
- > /*
- > * call-seq:
- > * ary.sample -> obj
- > * ary.sample(n) -> new_ary
- > *
- > * Choose a random element or +n+ random elements from the array.
- > *
- > * The elements are chosen by using random and unique indices into the array
- > * in order to ensure that an element doesn't repeat itself unless the array
- > * already contained duplicate elements.
- > *
- > * If the array is empty the first form returns +nil+ and the second form
- > * returns an empty array.
- > */
- >
- > static mrb_value
- > mrb_ary_sample(mrb_state *mrb, mrb_value ary)
- > {
- > mrb_int n = 0;
- > mrb_bool given;
- > mt_state *random = NULL;
- > mrb_int len = RARRAY_LEN(ary);
- >
- > mrb_get_args(mrb, "|i?d", &n, &given, &random, &mt_state_type);
- > if (random == NULL) {
- > random = get_random_state(mrb);
- > }
- > mrb_random_rand_seed(mrb, random);
- > mt_rand(random);
- > if (!given) { /* pick one element */
- > switch (len) {
- > case 0:
- > return mrb_nil_value();
- > case 1:
- > return RARRAY_PTR(ary)[0];
- > default:
- > return RARRAY_PTR(ary)[mt_rand(random) % len];
- > }
- > }
- > else {
- > mrb_value result;
- > mrb_int i, j;
- >
- > if (n < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "negative sample number");
- > if (n > len) n = len;
- > result = mrb_ary_new_capa(mrb, n);
- > for (i=0; i<n; i++) {
- > mrb_int r;
- >
- > for (;;) {
- > retry:
- > r = mt_rand(random) % len;
- >
- > for (j=0; j<i; j++) {
- > if (mrb_fixnum(RARRAY_PTR(result)[j]) == r) {
- > goto retry; /* retry if duplicate */
- > }
- > }
- > break;
- > }
- > mrb_ary_push(mrb, result, mrb_fixnum_value(r));
- > }
- > for (i=0; i<n; i++) {
- > mrb_ary_set(mrb, result, i, RARRAY_PTR(ary)[mrb_fixnum(RARRAY_PTR(result)[i])]);
- > }
- > return result;
- > }
- > }
- >
- >
- 318c334
- <
- ---
- >
- 320a337,340
- > mrb_define_method(mrb, array, "sample", mrb_ary_sample, MRB_ARGS_OPT(2));
- >
- > mrb_const_set(mrb, mrb_obj_value(random), mrb_intern_lit(mrb, "DEFAULT"),
- > mrb_obj_new(mrb, random, 0, NULL));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement