15template <std::uniform_random_bit_generator G>
18 static_assert(
sizeof(
typename G::result_type) <=
sizeof(std::uint64_t),
19 "engines wider than 64 bits are not supported");
20 constexpr std::uint64_t
range =
static_cast<std::uint64_t
>(G::max() - G::min());
21 if constexpr (
range == std::numeric_limits<std::uint64_t>::max())
24 return std::bit_width(
range + 1) - 1;
32template <std::uniform_random_bit_generator G>
36 constexpr std::uint64_t
range =
static_cast<std::uint64_t
>(G::max() - G::min());
37 constexpr bool exact =
width == 64 ||
range + 1 == (std::uint64_t{1} << (
width % 64));
38 if constexpr (
width == 64) {
39 std::uint64_t v =
static_cast<std::uint64_t
>(
g() - G::min());
42 std::uint64_t
bits = 0;
45 std::uint64_t v =
static_cast<std::uint64_t
>(
g() - G::min());
46 if constexpr (!exact) {
62template <std::
floating_po
int Real, std::uniform_random_bit_generator G>
65 constexpr int b = std::numeric_limits<Real>::digits - 1;
66 if constexpr (b <= 64) {
68 return std::ldexp(k +
static_cast<Real
>(0.5), -b);
72 return std::ldexp(std::ldexp(
high, b - 64) +
low +
static_cast<Real
>(0.5), -b);
77template <std::
floating_po
int Real, std::uniform_random_bit_generator G>
80 constexpr int b = std::numeric_limits<Real>::digits < 64 ? std::numeric_limits<Real>::digits : 64;
82 return k / (std::ldexp(
static_cast<Real
>(1), b) - 1);
86template <std::
floating_po
int Real, std::uniform_random_bit_generator G>
89 constexpr int b = std::numeric_limits<Real>::digits < 64 ? std::numeric_limits<Real>::digits : 64;
91 return std::ldexp(k, -b);
99template <std::uniform_random_bit_generator G>
102 const std::uint64_t threshold = (0 - n) % n;
104 while (v < threshold)
120 template <std::uniform_random_bit_generator G>
121 requires(!std::same_as<std::remove_cv_t<G>,
EngineRef>)
The EngineRef class Non-owning, type-erased reference to any uniform random bit generator.
Definition engine/uniform.hpp:116
result_type operator()()
Definition engine/uniform.hpp:129
std::uint64_t result_type
Definition engine/uniform.hpp:118
static constexpr result_type min() noexcept
Definition engine/uniform.hpp:126
EngineRef(G &engine) noexcept
Definition engine/uniform.hpp:122
static constexpr result_type max() noexcept
Definition engine/uniform.hpp:127
std::uint64_t uniformBelow(G &g, std::uint64_t n)
Definition engine/uniform.hpp:100
Real uniform01Closed(G &g)
k / (2^b - 1) for b = min(digits, 64) random bits: uniform on [0, 1]
Definition engine/uniform.hpp:78
Real uniform01HalfClosed(G &g)
k / 2^b for b = min(digits, 64) random bits: uniform on [0, 1)
Definition engine/uniform.hpp:87
std::uint64_t randomBits(G &g, int count)
Definition engine/uniform.hpp:33
Real uniform01(G &g)
Definition engine/uniform.hpp:63
constexpr int engineBits() noexcept
Number of uniformly distributed bits in one output of G: floor(log2(max - min + 1))
Definition engine/uniform.hpp:16
Real standardNormal(G &g)
Ziggurat algorithm of Marsaglia and Tsang with 256 layers and an explicit sign bit.
Definition variates.hpp:45