mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2025-07-12 14:54:10 +00:00
fix random generation implementation
This commit is contained in:
parent
406a1ff789
commit
3879666b02
18 changed files with 140 additions and 110 deletions
|
@ -16,6 +16,7 @@
|
|||
#include <sprout/random/detail/signed_unsigned_tools.hpp>
|
||||
#include <sprout/random/detail/uniform_int_float.hpp>
|
||||
#include <sprout/random/random_result.hpp>
|
||||
#include <sprout/generator/functions.hpp>
|
||||
#include <sprout/assert.hpp>
|
||||
|
||||
namespace sprout {
|
||||
|
@ -182,9 +183,9 @@ namespace sprout {
|
|||
)
|
||||
{
|
||||
return sprout::random::detail::generate_uniform_int_true_3_1_1<D + 1>(
|
||||
rnd.engine(), min_value, range,
|
||||
sprout::generators::next_generator(rnd), min_value, range,
|
||||
bmin, brange, bucket_size,
|
||||
sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin) / bucket_size
|
||||
sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin) / bucket_size
|
||||
);
|
||||
}
|
||||
template<int D, typename EngineResult, typename T, typename RangeType, typename BaseResult, typename BaseUnsigned, SPROUT_RECURSIVE_FUNCTION_TEMPLATE_BREAK_DECL(D)>
|
||||
|
@ -328,14 +329,14 @@ namespace sprout {
|
|||
return mult * RangeType(brange) == range - mult + 1
|
||||
? sprout::random::detail::generate_uniform_int_result<T, typename EngineResult::engine_type>{
|
||||
static_cast<T>(
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin) * mult)
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin) * mult)
|
||||
),
|
||||
rnd.engine()
|
||||
sprout::generators::next_generator(rnd)
|
||||
}
|
||||
: sprout::random::detail::generate_uniform_int_true_2_1<D + 1>(
|
||||
rnd.engine(), min_value, range,
|
||||
sprout::generators::next_generator(rnd), min_value, range,
|
||||
bmin, brange, limit,
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin) * mult),
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin) * mult),
|
||||
mult * (RangeType(brange) + RangeType(1))
|
||||
)
|
||||
;
|
||||
|
@ -422,10 +423,10 @@ namespace sprout {
|
|||
typedef typename std::make_unsigned<BaseResult>::type base_unsigned;
|
||||
return sprout::random::detail::generate_uniform_int_result<T, typename EngineResult::engine_type>{
|
||||
sprout::random::detail::add<base_unsigned, result_type>()(
|
||||
base_unsigned(sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin)),
|
||||
base_unsigned(sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin)),
|
||||
min_value
|
||||
),
|
||||
rnd.engine()
|
||||
sprout::generators::next_generator(rnd)
|
||||
};
|
||||
}
|
||||
template<int D, typename EngineResult, typename T, typename BaseResult, SPROUT_RECURSIVE_FUNCTION_TEMPLATE_BREAK(D)>
|
||||
|
@ -556,9 +557,9 @@ namespace sprout {
|
|||
)
|
||||
{
|
||||
return sprout::random::detail::generate_uniform_int_true_3_1_1(
|
||||
rnd.engine(), min_value, range,
|
||||
sprout::generators::next_generator(rnd), min_value, range,
|
||||
bmin, brange, bucket_size,
|
||||
sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin) / bucket_size
|
||||
sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin) / bucket_size
|
||||
);
|
||||
}
|
||||
template<typename Engine, typename T, typename RangeType, typename BaseResult, typename BaseUnsigned>
|
||||
|
@ -644,14 +645,14 @@ namespace sprout {
|
|||
return mult * RangeType(brange) == range - mult + 1
|
||||
? sprout::random::detail::generate_uniform_int_result<T, typename EngineResult::engine_type>{
|
||||
static_cast<T>(
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin) * mult)
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin) * mult)
|
||||
),
|
||||
rnd.engine()
|
||||
sprout::generators::next_generator(rnd)
|
||||
}
|
||||
: sprout::random::detail::generate_uniform_int_true_2_1(
|
||||
rnd.engine(), min_value, range,
|
||||
sprout::generators::next_generator(rnd), min_value, range,
|
||||
bmin, brange, limit,
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin) * mult),
|
||||
result + static_cast<RangeType>(sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin) * mult),
|
||||
mult * (RangeType(brange) + RangeType(1))
|
||||
)
|
||||
;
|
||||
|
@ -710,10 +711,10 @@ namespace sprout {
|
|||
typedef typename std::make_unsigned<BaseResult>::type base_unsigned;
|
||||
return sprout::random::detail::generate_uniform_int_result<T, typename EngineResult::engine_type>{
|
||||
sprout::random::detail::add<base_unsigned, result_type>()(
|
||||
base_unsigned(sprout::random::detail::subtract<BaseResult>()(rnd.result(), bmin)),
|
||||
base_unsigned(sprout::random::detail::subtract<BaseResult>()(sprout::generators::generated_value(rnd), bmin)),
|
||||
min_value
|
||||
),
|
||||
rnd.engine()
|
||||
sprout::generators::next_generator(rnd)
|
||||
};
|
||||
}
|
||||
template<typename Engine, typename T, typename RangeType, typename BaseResult, typename BaseUnsigned>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue