10#include <kernel/util/type_traits.hpp>
25 template<typename T_, typename TypeClass_ = typename Type::Traits<T_>::TypeClass>
77 auto now = std::chrono::high_resolution_clock::now();
78 _seed =
_x = std::chrono::duration_cast<std::chrono::duration<SeedType, std::nano>>(now.time_since_epoch()).count() +
SeedType(17u);
132 template<
typename T_>
135 x = FEAT::Intern::RandomNumber<T_>::gen(*
this);
156 template<
typename T_>
159 return FEAT::Intern::RandomNumber<T_>::gen_ranged(*
this, std::min(a, b), std::max(a, b));
168 template<
typename T_,
size_t num_
bytes_ = sizeof(T_)>
172 template<
typename T_,
bool signed_ = (Type::Traits<T_>::is_
signed)>
183 template<
typename T_>
184 class NonNegInt<T_, true>
189 return (x < T_(0) ? T_(-(x + T_(1))) : x);
194 template<
typename T_>
195 class RandomInteger<T_, 1>
198 static T_ gen(Random& rng)
200 return (T_)(rng.next() & 0xFFu);
205 template<
typename T_>
206 class RandomInteger<T_, 2>
209 static T_ gen(Random& rng)
211 return (T_)(rng.next() & 0xFFFFu);
216 template<
typename T_>
217 class RandomInteger<T_, 4>
220 static T_ gen(Random& rng)
222 return (T_)(rng.next() & 0xFFFFFFFFu);
227 template<
typename T_>
228 class RandomInteger<T_, 8>
231 static T_ gen(Random& rng)
233 return (T_)(rng.next());
238 template<
typename T_>
239 class RandomNumber<T_,
Type::IntegralClass> :
240 public RandomInteger<T_>
243 static T_ gen_ranged(Random& rng, T_ a, T_ b)
247 T_ x = NonNegInt<T_>::make(RandomInteger<T_>::gen(rng));
252 return T_(a + T_(x % T_(T_(b - a) + T_(1))));
259 template<
typename T_>
260 class RandomNumber<T_,
Type::FloatingClass>
263 static T_ gen(Random& rng)
265 static constexpr std::uint64_t mask = std::uint64_t(0xFFFFFFFFull);
266 const double d = 1.0 / double(mask);
267 return T_(
double(rng.next() & mask) * d);
270 static T_ gen_ranged(Random& rng, T_ a, T_ b)
273 static const T_
eps = std::numeric_limits<T_>::epsilon();
278 return a + x * (b - a);
285 template<
typename T_>
286 class RandomNumber<T_,
Type::BooleanClass>
289 static T_ gen(Random& rng)
291 return T_(
int(rng.next() & 0x8ull) != 0);
294 static T_ gen_ranged(Random& rng, T_ a, T_ b)
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Pseudo-Random Number Generator.
T_ operator()(T_ a, T_ b)
Ranged evaluation operator.
uint64_t next()
Returns the next number in the stream.
std::uint64_t _seed
the rng's original seed
std::uint64_t SeedType
seed type
Random(SeedType seed)
Constructor.
std::uint64_t _x
the rng's working values
Random & operator>>(T_ &x)
Extraction operator.
SeedType get_seed() const
static constexpr SeedType xor_mult
internal multiplier
Random()
Default constructor that seeds the RNG with the current high-resolution clock time.
T_ eps()
Returns the machine precision constant for a floating-point data type.