mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Added get_real
interface
This commit is contained in:
parent
c449b9b02f
commit
d6ec0ef59b
Notes:
git
2020-09-07 20:08:35 +09:00
4 changed files with 20 additions and 0 deletions
|
@ -7,10 +7,13 @@ typedef struct {
|
||||||
uint32_t num, idx, *buf;
|
uint32_t num, idx, *buf;
|
||||||
} rand_loop_t;
|
} rand_loop_t;
|
||||||
|
|
||||||
|
static double loop_get_real(rb_random_t *rnd, int excl);
|
||||||
|
|
||||||
RB_RANDOM_INTERFACE_DECLARE(loop)
|
RB_RANDOM_INTERFACE_DECLARE(loop)
|
||||||
static const rb_random_interface_t random_loop_if = {
|
static const rb_random_interface_t random_loop_if = {
|
||||||
32,
|
32,
|
||||||
RB_RANDOM_INTERFACE_DEFINE(loop)
|
RB_RANDOM_INTERFACE_DEFINE(loop)
|
||||||
|
loop_get_real,
|
||||||
};
|
};
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
|
@ -91,6 +94,13 @@ loop_get_int32(rb_random_t *rnd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double
|
||||||
|
loop_get_real(rb_random_t *rnd, int excl)
|
||||||
|
{
|
||||||
|
uint32_t a = loop_get_int32(rnd);
|
||||||
|
return ldexp(a, -16);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Init_random_loop(VALUE mod, VALUE base)
|
Init_random_loop(VALUE mod, VALUE base)
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,12 +28,14 @@ typedef struct {
|
||||||
typedef void rb_random_init_func(rb_random_t *, const uint32_t *, size_t);
|
typedef void rb_random_init_func(rb_random_t *, const uint32_t *, size_t);
|
||||||
typedef unsigned int rb_random_get_int32_func(rb_random_t *);
|
typedef unsigned int rb_random_get_int32_func(rb_random_t *);
|
||||||
typedef void rb_random_get_bytes_func(rb_random_t *, void *, size_t);
|
typedef void rb_random_get_bytes_func(rb_random_t *, void *, size_t);
|
||||||
|
typedef double rb_random_get_real_func(rb_random_t *, int);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
size_t default_seed_bits;
|
size_t default_seed_bits;
|
||||||
rb_random_init_func *init;
|
rb_random_init_func *init;
|
||||||
rb_random_get_int32_func *get_int32;
|
rb_random_get_int32_func *get_int32;
|
||||||
rb_random_get_bytes_func *get_bytes;
|
rb_random_get_bytes_func *get_bytes;
|
||||||
|
rb_random_get_real_func *get_real;
|
||||||
} rb_random_interface_t;
|
} rb_random_interface_t;
|
||||||
|
|
||||||
#define rb_rand_if(obj) \
|
#define rb_rand_if(obj) \
|
||||||
|
|
1
random.c
1
random.c
|
@ -989,6 +989,7 @@ random_real(VALUE obj, rb_random_t *rnd, int excl)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const rb_random_interface_t *rng = try_rand_if(obj, rnd);
|
const rb_random_interface_t *rng = try_rand_if(obj, rnd);
|
||||||
|
if (rng->get_real) return rng->get_real(rnd, excl);
|
||||||
a = random_int32(rng, rnd);
|
a = random_int32(rng, rnd);
|
||||||
b = random_int32(rng, rnd);
|
b = random_int32(rng, rnd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,5 +16,12 @@ module TestRandomExt
|
||||||
rnd = Bug::Random::Loop.new(1)
|
rnd = Bug::Random::Loop.new(1)
|
||||||
assert_equal(1, rnd.rand(10))
|
assert_equal(1, rnd.rand(10))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_real
|
||||||
|
assert_equal(0.25, Bug::Random::Loop.new(1<<14).rand)
|
||||||
|
assert_equal(0.50, Bug::Random::Loop.new(2<<14).rand)
|
||||||
|
assert_equal(0.75, Bug::Random::Loop.new(3<<14).rand)
|
||||||
|
assert_equal(1.00, Bug::Random::Loop.new(4<<14).rand)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue