置換ありおよびなしの重み付きランダム選択
置換ありまたはなしでリストから要素をランダムに選択することは、プログラミングにおける一般的なタスクです。非重み付け選択と置換なしの重み付け選択の確立された方法はありますが、置換を使用して重み付けされた要素を選択することには独特の課題が生じます。
置換付き重み付け選択の別名メソッド
1このシナリオで最も効率的なアプローチは、Alias メソッドです。これには、重み付けされたリストを効率的に表す同じサイズのビンの作成が含まれます。
実装手順:
-
重みの正規化: 次のように重みを調整します。それらの合計は 1.0 となり、選択確率を表します。
-
パーティションの作成: 要素の数より大きい 2 の最小の累乗を決定し、その数のパーティションを作成します。
-
重みの割り当て: 空のパーティションに最小の重みを持つ要素を配置し、可能な限り埋めます。
-
パーティションを埋める: パーティションがいっぱいでない場合は、残りのスペースを埋めるために最も高い重みを持つ要素。
-
繰り返し: すべての要素が考慮されるまで重みを割り当て続けます。
実行時選択:
- 0 と 1 の間の乱数を生成します。
- パーティション数の対数で数値をビットシフトします (プラットフォームでビットシフトが高速であると仮定します)。 ).
- パーティションが分割されている場合は、シフトされた数値の小数部分を使用して、どの要素を選択するかを決定します。
エイリアス方式の利点:
- 置換による高速かつ効率的な選択。
- 大規模な選択の場合、リザーバー方式を回避します。
- 実装が簡単でメモリ効率が良い。
以上が置換を伴う重み付きランダム選択を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。