#pragma once #include <limits> #include <random> namespace base { template <class T> class UniformRandom { static_assert(std::is_integral<T>::value); std::random_device m_rd; std::mt19937 m_gen; std::uniform_int_distribution<T> m_distr; public: UniformRandom(T min, T max) : m_gen(m_rd()), m_distr(min, max) {} UniformRandom() : UniformRandom(std::numeric_limits<T>::min(), std::numeric_limits<T>::max()) {} T operator()() { return m_distr(m_gen); } }; } // namespace base