Example #1
0
File: random.c Project: ASnow/mruby
static mrb_value
mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
{
  mrb_int i;
  mt_state *random = NULL;

  if (RARRAY_LEN(ary) > 1) {
    mrb_get_args(mrb, "|d", &random, &mt_state_type);

    if (random == NULL) {
      random = get_random_state(mrb);
    }
    mrb_random_rand_seed(mrb, random);

    mrb_ary_modify(mrb, mrb_ary_ptr(ary));

    for (i = RARRAY_LEN(ary) - 1; i > 0; i--)  {
      mrb_int j;
      mrb_value tmp;

      j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary))));

      tmp = RARRAY_PTR(ary)[i];
      mrb_ary_ptr(ary)->ptr[i] = RARRAY_PTR(ary)[j];
      mrb_ary_ptr(ary)->ptr[j] = tmp;
    }
  }

  return ary;
}
Example #2
0
static mrb_value
mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
{
  mrb_int i;
  mrb_value random = mrb_nil_value();
  
  if (RARRAY_LEN(ary) > 1) {
    mrb_get_args(mrb, "|o", &random);

    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);
    }
  
    mrb_ary_modify(mrb, mrb_ary_ptr(ary));
    
    for (i = RARRAY_LEN(ary) - 1; i > 0; i--)  {
      mrb_int j;
      
      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))));
      }
      
      mrb_value t = RARRAY_PTR(ary)[i];
      RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
      RARRAY_PTR(ary)[j] = t;
    }    
  }
  
  return ary;
}
Example #3
0
static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self)
{
  mrb_value *argv;
  mrb_int argc;
  mrb_value max;

  mrb_get_args(mrb, "*", &argv, &argc);

  if (argc == 0) {
    max = mrb_fixnum_value(0);
  } else if (argc == 1) {
    max = argv[0];
    if (!mrb_nil_p(max) && !mrb_fixnum_p(max)) {
      max = mrb_check_convert_type(mrb, max, MRB_TT_FIXNUM, "Fixnum", "to_int");
    }
    if (!mrb_nil_p(max) && mrb_fixnum(max) < 0) {
      max = mrb_fixnum_value(0 - mrb_fixnum(max));
    }

    if (!mrb_fixnum_p(max)) {
      mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid argument type");
      return mrb_nil_value();
    }
  } else {
    mrb_raisef(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 0..1)", argc);
    return mrb_nil_value();
  }

  mrb_value seed = mrb_gv_get(mrb, mrb_intern(mrb, RAND_SEED_KEY));
  if (mrb_nil_p(seed))
    mrb_random_mt_srand(mrb, mrb_nil_value());

  return mrb_random_mt_rand(mrb, max);
}
Example #4
0
static mrb_value
mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
{
  mrb_int i;
  mt_state *random = NULL;
  
  if (RARRAY_LEN(ary) > 1) {
    mrb_get_args(mrb, "|d", &random, &mt_state_type);

    if (random == NULL) {
      mrb_value random_val = mrb_const_get(mrb,
              mrb_obj_value(mrb_class_get(mrb, "Random")),
              mrb_intern_lit(mrb, "DEFAULT"));
      random = (mt_state *)DATA_PTR(random_val);
    }
    mrb_random_rand_seed(mrb, random);
  
    mrb_ary_modify(mrb, mrb_ary_ptr(ary));
    
    for (i = RARRAY_LEN(ary) - 1; i > 0; i--)  {
      mrb_int j;
      mrb_value tmp;
      
      j = mrb_fixnum(mrb_random_mt_rand(mrb, random, mrb_fixnum_value(RARRAY_LEN(ary))));
      
      tmp = RARRAY_PTR(ary)[i];
      RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j];
      RARRAY_PTR(ary)[j] = tmp;
    }    
  }
  
  return ary;
}
Example #5
0
File: random.c Project: ASnow/mruby
static mrb_value
mrb_random_rand(mrb_state *mrb, mrb_value self)
{
  mrb_value max;
  mt_state *t = DATA_GET_PTR(mrb, self, &mt_state_type, mt_state);

  max = get_opt(mrb);
  mrb_random_rand_seed(mrb, t);
  return mrb_random_mt_rand(mrb, t, max);
}
Example #6
0
static mrb_value 
mrb_random_rand(mrb_state *mrb, mrb_value self)
{
  mrb_value max;
  mt_state *t = DATA_PTR(self);

  max = get_opt(mrb);
  mrb_random_rand_seed(mrb, self);
  return mrb_random_mt_rand(mrb, t, max);
}
Example #7
0
static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self)
{
  mrb_value max;
  mrb_value seed;
  mt_state *t = mrb_mt_get_context(mrb, self);

  max = get_opt(mrb);
  seed = mrb_iv_get(mrb, self, mrb_intern2(mrb, INSTANCE_RAND_SEED_KEY, INSTANCE_RAND_SEED_KEY_CSTR_LEN));
  if (mrb_nil_p(seed)) {
    mrb_random_mt_srand(mrb, t, mrb_nil_value());
  }
  return mrb_random_mt_rand(mrb, t, max);
}
Example #8
0
File: random.c Project: Hozum/mruby
static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self)
{
  mrb_value max;
  mrb_value seed;
  mt_state *t = mrb_mt_get_context(mrb, self);

  max = get_opt(mrb);
  seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY));
  if (mrb_nil_p(seed)) {
    mrb_random_mt_srand(mrb, t, mrb_nil_value());
  }
  mrb_iv_set(mrb, self, mrb_intern(mrb, MT_STATE_KEY),
    mrb_obj_value(Data_Wrap_Struct(mrb, mrb->object_class, &mt_state_type, (void*) t)));
  return mrb_random_mt_rand(mrb, t, max);
}