業務でC#を用いることになったので、最近勉強していなくて朧気になってきた知識をReviseする意味でも、以下の書籍を読みながらC#で実装してみる。今回はP.192-202まで*1。
7. Monte Carloシミュレーション
7.1 乱数の生成
確率変数が一様分布
に従う乱数を一様乱数と呼ぶ。特に
のとき標準一様乱数という。
に対し、その実現値として
が得られたとする。
7.1.1 離散分布に従う乱数の生成方法
を確率分布、すなわち
とする。更にに対して
とおくと、
である。ここでに注意すれば
であるから、
が成り立つ。すなわちは
に従う離散的な確率変数となる。
7.1.2 連続分布に従う乱数の生成方法
逆関数が定義可能な分布関数について、
に対して
とおくと、の分布関数
であるから、
が成り立つ。したがって一様乱数に対して
とおけば、分布に従う乱数列を得ることが出来る。
7.2 正規乱数
正規分布に従う乱数を正規乱数という。正規乱数はさまざまな方法で生成する。
代表的なのがBox-Muller法である。一様乱数を生成し
にて正規乱数を得る。
互いに独立に標準正規分布に従う確率変数があるとき
は円周上で定数値を取る。したがってその偏角
は上で一様分布に従う。
また
は自由度のカイ二乗分布に従う。カイ二乗分布の性質から、
である。
以上の性質から、一様乱数があったときに
とおけば、
はいずれも標準正規分布に従う。以上がBox-Muller法の原理である*2。
一般の正規分布には、平均を、分散を
とすれば
に対して
となるから、上式で更に変換すればよい。
(標準)正規分布の分布関数は逆関数を解析的に計算できないため、(標準)正規乱数を生成する際は、その近似式を用いるないしBox-Muller法を用いる。近似式としては、たとえばMoroの方法が知られている。
一様乱数に対して、標準正規乱数
を
ここで各変数値は以下のとおりである:
また
*1:今回はMoroの方法を実装したものの、裾部分が不自然でうまくいっていない様子であった。恐らく実装に誤りがあるので、改善し次第アップしたい
*2:以上はhttps://www.wikiwand.com/ja/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95による。