#ifndef CORE_MATH_RANDOMIZER_HH #define CORE_MATH_RANDOMIZER_HH 1 #pragma once namespace math { template class Randomizer final { public: explicit Randomizer(void); explicit Randomizer(std::uint64_t seed); virtual ~Randomizer(void) = default; void add(const T& value); const T& get(void); void clear(void); private: std::vector m_vector; std::mt19937_64 m_twister; std::uniform_int_distribution m_dist; }; } // namespace math template inline math::Randomizer::Randomizer(void) { m_vector.clear(); m_twister.seed(std::random_device()()); m_dist = std::uniform_int_distribution(0, 0); } template inline math::Randomizer::Randomizer(std::uint64_t seed) { m_vector.clear(); m_twister.seed(seed); m_dist = std::uniform_int_distribution(0, 0); } template inline void math::Randomizer::add(const T& value) { m_vector.push_back(value); m_dist = std::uniform_int_distribution(0, m_vector.size() - 1); } template inline const T& math::Randomizer::get(void) { return m_vector.at(m_dist(m_twister)); } template inline void math::Randomizer::clear(void) { m_vector.clear(); m_dist = std::uniform_int_distribution(0, 0); } #endif // CORE_MATH_RANDOMIZER_HH