mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
use 'd' format spec to get Random object
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
** See Copyright Notice in mruby.h
|
||||
*/
|
||||
|
||||
#include "mruby.h"
|
||||
#include "mt19937ar.h"
|
||||
|
||||
/* Period parameters */
|
||||
|
||||
@@ -13,6 +13,9 @@ typedef struct {
|
||||
unsigned long gen_int;
|
||||
double gen_dbl;
|
||||
};
|
||||
|
||||
mrb_int seed;
|
||||
mrb_bool has_seed;
|
||||
} mt_state;
|
||||
|
||||
void mrb_random_init_genrand(mt_state *, unsigned long);
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#include <time.h>
|
||||
|
||||
static char const GLOBAL_RAND_SEED_KEY[] = "$mrb_g_rand_seed";
|
||||
static char const INSTANCE_RAND_SEED_KEY[] = "$mrb_i_rand_seed";
|
||||
static char const MT_STATE_KEY[] = "$mrb_i_mt_state";
|
||||
|
||||
static const struct mrb_data_type mt_state_type = {
|
||||
@@ -188,7 +187,14 @@ mrb_random_init(mrb_state *mrb, mrb_value self)
|
||||
|
||||
seed = get_opt(mrb);
|
||||
seed = mrb_random_mt_srand(mrb, t, seed);
|
||||
mrb_iv_set(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY), seed);
|
||||
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);
|
||||
}
|
||||
|
||||
DATA_PTR(self) = t;
|
||||
|
||||
@@ -196,13 +202,9 @@ mrb_random_init(mrb_state *mrb, mrb_value self)
|
||||
}
|
||||
|
||||
static void
|
||||
mrb_random_rand_seed(mrb_state *mrb, mrb_value self)
|
||||
mrb_random_rand_seed(mrb_state *mrb, mt_state *t)
|
||||
{
|
||||
mrb_value seed;
|
||||
mt_state *t = DATA_PTR(self);
|
||||
|
||||
seed = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY));
|
||||
if (mrb_nil_p(seed)) {
|
||||
if (!t->has_seed) {
|
||||
mrb_random_mt_srand(mrb, t, mrb_nil_value());
|
||||
}
|
||||
}
|
||||
@@ -214,7 +216,7 @@ mrb_random_rand(mrb_state *mrb, mrb_value self)
|
||||
mt_state *t = DATA_PTR(self);
|
||||
|
||||
max = get_opt(mrb);
|
||||
mrb_random_rand_seed(mrb, self);
|
||||
mrb_random_rand_seed(mrb, t);
|
||||
return mrb_random_mt_rand(mrb, t, max);
|
||||
}
|
||||
|
||||
@@ -227,8 +229,15 @@ mrb_random_srand(mrb_state *mrb, mrb_value self)
|
||||
|
||||
seed = get_opt(mrb);
|
||||
seed = mrb_random_mt_srand(mrb, t, seed);
|
||||
old_seed = mrb_iv_get(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY));
|
||||
mrb_iv_set(mrb, self, mrb_intern_lit(mrb, INSTANCE_RAND_SEED_KEY), 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);
|
||||
}
|
||||
|
||||
return old_seed;
|
||||
}
|
||||
@@ -244,17 +253,16 @@ static mrb_value
|
||||
mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
|
||||
{
|
||||
mrb_int i;
|
||||
mrb_value random = mrb_nil_value();
|
||||
mt_state *random = NULL;
|
||||
|
||||
if (RARRAY_LEN(ary) > 1) {
|
||||
mrb_get_args(mrb, "|o", &random);
|
||||
mrb_get_args(mrb, "|d", &random, &mt_state_type);
|
||||
|
||||
if (mrb_nil_p(random)) {
|
||||
mrb_random_g_rand_seed(mrb);
|
||||
if (random) {
|
||||
mrb_random_rand_seed(mrb, random);
|
||||
}
|
||||
else {
|
||||
mrb_data_check_type(mrb, random, &mt_state_type);
|
||||
mrb_random_rand_seed(mrb, random);
|
||||
mrb_random_g_rand_seed(mrb);
|
||||
}
|
||||
|
||||
mrb_ary_modify(mrb, mrb_ary_ptr(ary));
|
||||
@@ -263,11 +271,11 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
|
||||
mrb_int j;
|
||||
mrb_value tmp;
|
||||
|
||||
if (mrb_nil_p(random)) {
|
||||
j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary))));
|
||||
if (random) {
|
||||
j = mrb_fixnum(mrb_random_mt_rand(mrb, random, 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_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary))));
|
||||
}
|
||||
|
||||
tmp = RARRAY_PTR(ary)[i];
|
||||
|
||||
Reference in New Issue
Block a user