return out = static_cast<T>(state);
}
+ /// special case for randrom(boolean), since static_cast<bool>(0b10) == true
+ bool operator ()(bool &out) noexcept {
+ return out = operator ()();
+ }
+
template<class T>
T Next() noexcept {
T next;
return (*this)(next);
}
+ float SNorm() noexcept {
+ return float(Next<std::uint32_t>()) * (1.0f / 2147483647.5f) - 1.0f;
+ }
+
+ float UNorm() noexcept {
+ return float(Next<std::uint32_t>()) * (1.0f / 4294967295.0f);
+ }
+
+ template<class Container>
+ typename Container::reference From(Container &c) {
+ return c[Next<typename Container::size_type>() % c.size()];
+ }
+ template<class Container>
+ typename Container::const_reference From(const Container &c) {
+ return c[Next<typename Container::size_type>() % c.size()];
+ }
+
private:
std::uint64_t state;
// bits 64, 63, 61, and 60 set to 1 (counting from 1 lo to hi)