#pragma once #include #include #include template class WeightedActionTable { public: WeightedActionTable(Generator* generator) : m_Generator(generator) {} typedef std::function ActionCallback; void AddAction(ActionCallback action, unsigned weight) { m_Actions.emplace_back(action); m_Weights.emplace_back(weight); m_Distribution = std::discrete_distribution(m_Weights.begin(), m_Weights.end()); } Result RunRandomAction() { auto random = m_Distribution(*m_Generator); return m_Actions[random](); } private: std::vector m_Actions; std::vector m_Weights; Generator* m_Generator; std::discrete_distribution m_Distribution; };