nishiru3の日記

備忘録です。ネットのゴミ。

ボックスミュラーのアルゴリズム

仕事で、乱数生成が必要になったので、アルゴリズムだけ備忘録を残します。
pythonであれば、numpyを使うのですが、業務によってはライブラリを使わない場合もあります。

参考にしたのは、下記の文献です。

自然科学の統計学 (基礎統計学)

自然科学の統計学 (基礎統計学)

このシリーズは3冊あるようで、3冊とも購入しました。
最近の書籍には珍しく?数式だったり証明が記述されており、
中身は充実してると思います。初版から20年以上たっていますが、
いまだに売れているということからも、この本の評価がわかると思います。
(もしかしたら、大学の教科書として使われていることが多いのかもしれませんが)

ちなみに、「人文・社会科学の統計学」については、経済学における統計学の使われ方も多少記述されており、
「ほうほう」と思わせてくれるものもありました。

人文・社会科学の統計学 (基礎統計学)

人文・社会科学の統計学 (基礎統計学)

以下、アルゴリズムです。
プログラムを書く場合は、一様乱数を呼び出せば、どの言語でもいけると思います。

一様乱数U1、U2から
X_1=\sqrt{-2\log{U_1}}\cos\left(2\pi U_2\right)
X_1=\sqrt{-2\log{U_1}}\sin\left(2\pi U_2\right)
により得られるX_1とX_2は互いに独立に標準正規分布N(0,1)に従う。
ちなみにlogは自然対数log_eである。

一般の正規分布N(\mu,\sigma^2)に従うZの場合は、
上記のXに対して、下記の線形変換で求める。

Z=\mu+\sigma X