今回も乱数を生成するお話。
累積分布関数の逆関数が求まるなら逆関数法、正規分布の場合はボックス=ミュラー法が使えるという話を書きましたが、
もっと一般の分布で使える方法として、フォンノイマンの棄却法というのがあることを最近知りました。
Wikipediaでは英語版のみページがあるようです:Rejection sampling
(自然科学の統計学に紹介されている 別名法もこれは離散版ですがアイデアが似てるので参考になるかも)
これは次のステップで行います。
まず、生成したい分布の確率密度関数$f(x)$の最大値$M$を求めておきます。
また、取得する乱数の区間$[x_{min}, x_{max}]$をきめます。
(ベータ分布や2項分布のような有限区間の値しか取らない乱数なら容易ですが、そうでない場合は十分大きな範囲をとって適当なところで区切るしかないですね)
そして、次の手順で乱数を生成します。
1. 標準一様分布$U(0, 1)$から二つの乱数$u, v$を生成する。
2. $x = x_{min}+(x_{max}-x_{min})u$ を計算し、区間$[x_{min}, x_{max}]$の乱数を得る。
3. $y = M*v$ を計算し、 $y$と$f(x)$を比較する。
4. 結果が$y<=f(x)$であれば、乱数として$x$を採用し、そうでない場合は、二つの乱数生成に戻ります。
$x$が乱数として採用される確率が$f(x)$の値に比例するため、
結果として確率密度関数$f$に従う乱数を得ることができます。