[解決済み] 加重乱数
質問
重み付き乱数を実装しようとしています。現在、壁に頭を打ち付けているばかりで、これを理解することができません。
私のプロジェクト (ホールデムのハンドレンジ、主観的オールインエクイティ分析) では、Boost のランダム関数を使用しています。そこで、私が 1 から 3 の間の乱数 (つまり、1、2、3 のいずれか) を選びたいとします。Boostのメルセンヌ・ツイスター・ジェネレータは、この点では魅力的に働きます。しかし、例えば次のように重み付けをしたい。
1 (weight: 90)
2 (weight: 56)
3 (weight: 4)
Boostには、このための何らかの機能があるのでしょうか?
どのように解決するのですか?
項目が個々の重みを持っている場合、ランダムに項目を選択するための簡単なアルゴリズムがあります。
1) すべての重みの合計を計算する。
2) 0以上かつ重みの総和より小さい乱数を選ぶ
3) 乱数から重さを引いて、乱数がその項目の重さより小さい項目を得るまで、項目を一つずつ見ていきます。
これを説明する擬似コード
int sum_of_weight = 0;
for(int i=0; i<num_choices; i++) {
sum_of_weight += choice_weight[i];
}
int rnd = random(sum_of_weight);
for(int i=0; i<num_choices; i++) {
if(rnd < choice_weight[i])
return i;
rnd -= choice_weight[i];
}
assert(!"should never get here");
これは、あなたのboostコンテナなどに適応させるのに簡単なはずです。
ウェイトがほとんど変更されないが、ランダムに 1 つを選ぶことが多く、コンテナがオブジェクトへのポインタを保存しているか、数ダース以上のアイテムがある限り (基本的に、これが役に立つか妨げになるかどうかは、プロファイルしなければわかりません)、最適化が行われます。
各アイテムに累積重量の合計を格納することで バイナリ検索 を使って、ピックウェイトに対応する項目をピックすることができます。
リスト内のアイテムの数がわからない場合、次のようなとてもすてきなアルゴリズムがあります。 リザーバーサンプリング というアルゴリズムがあり、これを適応して重み付けをすることができます。
関連
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] JavaScriptで特定の範囲のランダムな整数を生成する?
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] 英数字のランダムな文字列を生成する方法
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] 0から9までのランダムな整数を生成する
-
[解決済み】大文字と数字を含むランダムな文字列の生成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません