Boost.Random discrete_distribution
Boost.Randomの分布クラスであるdiscrete_distributionは、確率テーブルを指定して値を生成します。
#include <iostream> #include <boost/random/mersenne_twister.hpp> #include <boost/random/discrete_distribution.hpp> int main () { boost::random::mt19937 gen; boost::random::discrete_distribution<> dist = {0.1, 0.2, 0.7}; for (int i = 0; i < 10; ++i) { std::cout << dist(gen) << std::endl; } }
2 2 2 2 2 1 0 2 2 2
discrete_distributionは、確率テーブルに従って0から始まるインデックスを生成します。
上記の例では、0が出る確率が10%、1が出る確率が20%、2が出る確率が70%にしてあります。合計で1.0になる必要はなくて、10.0とか適当な値でも構いません。
ここではinitializer listで確率テーブルを設定していますが、イテレータやRangeでも設定できます。
#include <iostream> #include <boost/random/mersenne_twister.hpp> #include <boost/random/discrete_distribution.hpp> int main () { const double probabilities[] = {0.1, 0.2, 0.7}; boost::random::mt19937 gen; boost::random::discrete_distribution<> dist(probabilities); for (int i = 0; i < 10; ++i) { std::cout << dist(gen) << std::endl; } }
参照:
Class template discrete_distribution - Boost Random Library