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.
Type
bitmask for zfp header