私がnサイドのロードされたサイコロを持っているとします。サイコロを振ったときに、各サイドkがp kになる確率があります。サイコロのランダムなロールを効率的にシミュレートできるように、この情報を静的に(つまり、確率の固定セットに対して)保存するための優れたアルゴリズムがあるかどうか知りたいです。
現在、私はこの問題のO(lg n)ソリューションを持っています。すべてのkの最初のk側の累積確率のテーブルを保存し、[0、1)の範囲でランダムな実数を生成し、テーブルに対してバイナリ検索を実行して、累積的な値は選択した値以下です。私はこのソリューションが好きですが、ランタイムが確率を考慮に入れていないのは奇妙に思えます。特に、片側が常に表示される、または値が均一に分布する極値の場合、素朴なアプローチを使用してO(1)のロールの結果を生成することが可能ですが、私の解決策はまだ多くのステップをとっています。
この問題をランタイムで何らかの形で「適応」させる方法でこの問題を解決する方法についての提案はありますか?
編集:この質問への回答に基づいて、私はこの問題への多くのアプローチとその分析を説明する記事を書きました。エイリアスメソッドのVoseの実装は、サイコロごとにΘ(n)前処理時間とO(1)時間を与えるように見えます。これは本当に印象的です。うまくいけば、これは回答に含まれる情報への便利な追加です!