Boost.RandomやC++標準のdiscrete_distribution
は、確率テーブルに基いて、選択された0から始まるインデックスを返しますが、返される型はデフォルトでint
になっています。
しかし、返される値は配列のインデックスとして使うのが一般的でしょうから、int
ではなくsize_t
を生成して返してくれたほうが使いやすいです。
なので、discrete_distribution
を使うときは、基本的にテンプレート引数にsize_t
を指定するのがいいでしょう。
以下は、簡単なくじ引き(ガチャ)的な処理です。
#include <iostream> #include <vector> #include <boost/range/adaptor/transformed.hpp> #include <boost/random.hpp> struct Card { int id; double prob; Card(int id = 0, double prob = 0) : id(id), prob(prob) {} }; double select_prob(const Card& card) { return card.prob; } int main() { std::vector<Card> card_list; card_list.emplace_back(3, 40); card_list.emplace_back(1, 30); card_list.emplace_back(4, 30); card_list.emplace_back(5, 0); // 確率0%も混ぜてみる using namespace boost::adaptors; namespace random = boost::random; random::mt19937 gen; random::discrete_distribution<std::size_t> dist(card_list | transformed(select_prob)); for (int i = 0; i < 10; ++i) { const std::size_t select_index = dist(gen); std::cout << "card id : " << card_list[select_index].id << std::endl; } }
card id : 1 card id : 3 card id : 3 card id : 1 card id : 1 card id : 4 card id : 3 card id : 3 card id : 3 card id : 3