任意の分布に関して乱数を作りたかったのでメモ。
分布の逆関数を容易に求められる場合は、逆関数法を使ってしまうのが簡単なのだけど、
- どんな(一価の)関数にも適用出来る
- アルゴリズムが作りやすい
といった理由でここでは棄却法を使います。
以下のページを参考にしています。
数値計算法 2011/6/29 (pdf)
15 乱数とモンテカルロ法 (pdf)
von Neumannの棄却法
考え方はとてもシンプルで、
- 分布関数を含む範囲内で一様乱数のペア (
)を生成
具体的には分布関数の範囲を
、
確率変数
を
に従う一様分布と仮定した時に、
を作る。
- 生成した乱数ペア(
) が分布関数内に入っていれば、
を分布に従う乱数として採用(下図でいうと赤点が採用、×が不採用)

アルゴリズム的にはこんな感じ?(コード中にあるテストファイルはこちらから→”random_dist.txt“)
結果のヒストグラム:
