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