#include #include #include #include #include #include std::list l; std::list probs; int main() { l.push_back(-5); l.push_back(-3); l.push_back(-1); l.push_back(0); l.push_back(2); l.push_back(4); l.push_back(6); probs.push_back(-100); probs.push_back(-50); probs.push_back(-5); probs.push_back(0); probs.push_back(12); probs.push_back(75); probs.push_back(150); auto minmax = std::minmax_element(probs.begin(), probs.end()); for (auto it = probs.begin(); it != probs.end(); ++it) { (*it) += std::abs(*(minmax.first)) + (std::abs(*(minmax.first)) + std::abs(*(minmax.second))) / 2.0 + 1; } std::cout << "Weights:"; for (auto it = probs.begin(); it != probs.end(); ++it) { std::cout << " " << *it; } std::cout << std::endl; boost::random::taus88 rng(0x13141516); boost::random::discrete_distribution<> distr(probs.begin(), probs.end()); std::cout << "Probabilities:"; for (auto it = distr.probabilities().begin(); it != distr.probabilities().end(); ++it) { std::cout << " " << *it; } std::cout << std::endl; std::cout << "Rollin..." << std::endl; for (int i = 0; i < 1000; ++i) { std::list::iterator rolled = l.begin(); std::advance(rolled, distr(rng)); std::cout << "Rolled " << *rolled << std::endl; } return 0; }