map<string,float>
のサイズは10000です。値(float)はそのキー(文字列)の確率で、1になる非負のエントリです。値の確率に基づいてマップからランダムキーを取得
など。キー(値):A(0.5);B(0.3);C(0.2)
確率vector
(私にはベクトルがないことがわかります)に基づいて、ランダムキーを取得する方法{0.5,0.3,0.2}
?
C++11
を使用できます。
ありがとうございます。
map<string,float>
のサイズは10000です。値(float)はそのキー(文字列)の確率で、1になる非負のエントリです。値の確率に基づいてマップからランダムキーを取得
など。キー(値):A(0.5);B(0.3);C(0.2)
確率vector
(私にはベクトルがないことがわかります)に基づいて、ランダムキーを取得する方法{0.5,0.3,0.2}
?
C++11
を使用できます。
ありがとうございます。
累積確率をキーとする追加のマップを作成し、その値は最初のマップのイテレータまたは必要な文字列だけにします。たとえば、0(A)、0.5(B)、0.8(C)です。その後、0と1の間の乱数値を生成し、最後にその値で2番目のマップにlower_bound
を使用します。
[std :: partial_sum](http://en.cppreference.com/w/cpp/algorithm/partial_sum)は最初の部分に役立ちます – Caleth
@Caleth良いアイデアですが、それは1から始まります( 'lower_bound'では最初のエントリがゼロになる必要があります)、イテレータを直接逆参照します。 IMOでは、アルゴリズムを動作させるために、すべてを変換するよりも、ループを手で書く方が簡単です。実際、私はしばしばそれを見つける。 –
'float acc = 0.0;のようなファンクタが必要です。 auto exclusive_plus = [&acc](float lhs、float rhs){スワップ(lhs、acc);リターンlhs + rhs; } '。あるいは、C++ 17の 'std :: exclusive_scan'と同等のものです – Caleth
最初の手順は、0と1の間のランダムな値を取得するように見えます。次に、値で検索するので、唯一できることは値を繰り返し処理することです。 –