正規分布サンプリング; ガウス分布サンプリング; Normal Distribution Sampling; Gaussian Distribution Sampling
概要
正規分布とは以下の式で表現される確率分布。最も代表的な確率分布で、分散をもつ確率分布に従う確率変数の総和は、中心極限定理によりこの正規分布に収束していく。
$$f(x)=\frac{1}{\sqrt{2 \pi \sigma^2}} exp \left(-\frac{(x-\mu)^2}{2 \sigma^2} \right) $$
この正規分布のサンプリングにはミュラーボックス法[1]が用いられる。
ソースコード
namespace ExRandom.Continuous {
public class NormalRandom : Random{
readonly MT19937 mt;
readonly double sigma, mu;
double r;
bool is_pear_generate = false;
public NormalRandom(MT19937 mt, double sigma = 1, double mu = 0) {
if(mt == null) {
throw new ArgumentNullException();
}
this.mt = mt;
this.sigma = sigma;
this.mu = mu;
}
private double Generate() {
if(is_pear_generate) {
is_pear_generate = false;
return r;
}
else {
double z1, z2, sq_log_z1, pi_z2;
is_pear_generate = true;
z1 = mt.NextDouble_OpenInterval0();
z2 = mt.NextDouble_OpenInterval0();
sq_log_z1 = Math.Sqrt(-2.0 * Math.Log(z1));
pi_z2 = 2.0 * Math.PI * z2;
r = sq_log_z1 * Math.Sin(pi_z2);
return sq_log_z1 * Math.Cos(pi_z2);
}
}
public override double Next() {
return Generate() * sigma + mu;
}
}
}
関連項目
メルセンヌ・ツイスタ
各種確率分布サンプリング基本クラス
引用文献
[1] “A note on the generation of random normal deviates”, George E.P. Box, Mervin E. Muller, The Annals of Mathematical Statistics, vol.29, no.2, pp.610-611, 1958