2017-10-23 7 views
1

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

最初の手順は、0と1の間のランダムな値を取得するように見えます。次に、値で検索するので、唯一できることは値を繰り返し処理することです。 –

答えて

1

累積確率をキーとする追加のマップを作成し、その値は最初のマップのイテレータまたは必要な文字列だけにします。たとえば、0(A)、0.5(B)、0.8(C)です。その後、0と1の間の乱数値を生成し、最後にその値で2番目のマップにlower_boundを使用します。

+1

[std :: partial_sum](http://en.cppreference.com/w/cpp/algorithm/partial_sum)は最初の部分に役立ちます – Caleth

+0

@Caleth良いアイデアですが、それは1から始まります( 'lower_bound'では最初のエントリがゼロになる必要があります)、イテレータを直接逆参照します。 IMOでは、アルゴリズムを動作させるために、すべてを変換するよりも、ループを手で書く方が簡単です。実際、私はしばしばそれを見つける。 –

+0

'float acc = 0.0;のようなファンクタが必要です。 auto exclusive_plus = [&acc](float lhs、float rhs){スワップ(lhs、acc);リターンlhs + rhs; } '。あるいは、C++ 17の 'std :: exclusive_scan'と同等のものです – Caleth

関連する問題