47 lines
1001 B
C++
47 lines
1001 B
C++
#ifndef tests_rng_483f8f25f09ae06
|
|
#define tests_rng_483f8f25f09ae06
|
|
|
|
#include <array>
|
|
#include <random>
|
|
|
|
struct rng {
|
|
rng(auto s)
|
|
: seed(s)
|
|
, generator(seed) {}
|
|
|
|
rng()
|
|
: rng([] { return std::random_device{}(); }()) {}
|
|
|
|
template <typename T>
|
|
requires std::is_integral_v<T>
|
|
T get() noexcept {
|
|
union {
|
|
std::array<std::mt19937::result_type,
|
|
1 + sizeof(T) / sizeof(std::mt19937::result_type)>
|
|
data;
|
|
T v;
|
|
} u;
|
|
|
|
for (auto& d : u.data) {
|
|
d = generator();
|
|
}
|
|
|
|
return u.v;
|
|
}
|
|
|
|
template <typename T, std::size_t N>
|
|
requires std::is_integral_v<T>
|
|
auto get() noexcept {
|
|
std::array<T, N> values;
|
|
for (auto& value : values) {
|
|
value = get<T>();
|
|
}
|
|
return values;
|
|
}
|
|
|
|
std::random_device::result_type seed;
|
|
std::mt19937 generator;
|
|
};
|
|
|
|
#endif // tests_rng_483f8f25f09ae06
|