読者です 読者をやめる 読者になる 読者になる

discrete_distributionでsize_tを生成させる

C++

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