SSブログ

曲がった迷路その17 - 一様でない乱数発生の例 [曲がった壁を持つ迷路の生成]

前回、一様乱数から指定された出現確率に従った乱数を発生させるための数学を考えた。今回、それにもとづいて普段よくやる例ふたつをみる。

単位円内の例

よくあるのが、2次元で、単位円内に一様に乱数を発生させたい場合。

簡単な方法は
0723eq50.png
として
0723eq51.png
を満たす組みだけ取り出す、というものである。ここでRUは昨日出てきた[0,1]区間の一様乱数発生器。簡単だけど、これでは5回に1回は捨てることになって効率が悪い。品質のいい乱数は発生コストも高いのであまり捨てたくない。
そこでうっかり
0723eq52.png
としてしまうが、当然これはだめ。中心付近の出現確率が高くなってしまう。

これは、ちゃんとヤコビアンに従って
0723eq54.png
で、RLの発生確率fL(r)が
0723eq56.png
としなければいけない。
これを一様乱数から作る変換関数gL(z)は式-49から、
0723eq57.png
となる。

ガウシアンの例

ガウシアン、いわゆる正規分布に乱数を発生させることを考える。 この場合、確率分布関数fG(x)はaを正の定数として
0723eq58.png
である。この変換関数gG(z)は簡単には求まらない。無理矢理書くと
0723eq59.png
となる。ここでerf-1(x)は誤差関数の逆関数で、誤差関数erf(x)とは
0723eq60.png
である。そのまんま。なんにもやってないのと同じだけど、みんなよく使うので数値評価はされている。MathematicaやMATLABは標準関数として数値評価できる。Mathematicaはどうやら誤差関数を数値的に解き直しているらしい。

実用的なアルゴリズムとしてボックス・ミューラー法という方法がある。これはいろいろなところに解説があるので省略する。gslもガウシアンの乱数発生器はボックスミューラーを使っている。

他に、ベキ展開してしまう、と言う方法もある。
生の逆誤差関数erf-1(x)をMathematicaでx=0で10次までのベキ展開すると
0723eq61.png
となる。x=0の近くでは素直な形をしているので残差は小さい。

x=1で展開するとMathematicaは面白いものを返してくる。
0723eq62.png
なんでこんなものが出てくるのかわからないが、この二つの式をx=0.8あたりでつなげば数値的には残差は10-3程度に収まって、乱数発生器とするには十分な精度が得られる。もっとこまかく区間に分ければ次数も低くて高い精度が得られる。もちろんボックス・ミューラーの方が効率はいいけど、こういうのもたまには面白い。

特殊な分布(確率密度関数)の乱数を発生させたい場合などで、積分や逆関数が解析的に求まらない場合、こういう力づくの手もある。

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。