13#if !defined(ULTRA_RANDOM_H)
18#include "utility/assert.h"
19#include "utility/misc.h"
20#include "utility/xoshiro256ss.h"
25namespace ultra::random
28enum class distribution {uniform, normal};
39[[nodiscard]] std::size_t
ring(std::size_t, std::size_t, std::size_t);
56template<std::
floating_po
int T>
61 std::uniform_real_distribution<T> d(min,
sup);
78template<std::
integral T>
83 std::uniform_int_distribution<T> d(min,
sup - 1);
88requires std::is_enum_v<T>
89[[nodiscard]] T between(T min, T sup)
93 return static_cast<T
>(between<std::underlying_type_t<T>>(min, sup));
103requires std::is_arithmetic_v<T> || std::is_enum_v<T>
113template<std::ranges::sized_range C>
114[[nodiscard]] std::ranges::range_reference_t<const C>
element(
const C &c)
120 static_cast<typename C::difference_type
>(
sup(c.size())));
127template<ArithmeticScalar A>
137template<std::ranges::sized_range C>
138[[nodiscard]]
typename C::value_type &
element(C &c)
144 static_cast<typename C::difference_type
>(
sup(c.size())));
158 std::bernoulli_distribution d(p);
175 class thread_local_coin_flip
178 [[nodiscard]]
bool operator()()
180 if (!bits_left_) [[unlikely]]
183 bits_left_ = std::numeric_limits<word_t>::digits;
186 const bool result((cache_ >> (bits_left_ - 1)) & 1u);
192 using word_t = random::engine_t::result_type;
195 unsigned bits_left_ {std::numeric_limits<word_t>::digits};
198 thread_local thread_local_coin_flip coin_flip;
218requires std::is_arithmetic_v<T>
225 case distribution::normal:
226 return std::normal_distribution<T>(std::midpoint(p1, p2),
void randomize()
Definition random.cc:115
std::size_t ring(std::size_t base, std::size_t radius, std::size_t n)
Definition random.cc:64
engine_t & engine()
Definition random.cc:83
T ephemeral(distribution d, T p1, T p2)
Definition random.h:219
std::ranges::range_reference_t< const C > element(const C &c)
Definition random.h:114
T sup(T sup)
Definition random.h:104
bool boolean(double p)
Definition random.h:154
vigna::xoshiro256ss engine_t
Definition random.h:36
T between(T min, T sup)
Definition random.h:57