逆ガウス分布サンプリング; Inverse Gaussian Distribution Sampling
概要
逆ガウス分布とは以下の式で表現される確率分布。
$$ f(x)=\left( \frac{\lambda}{2 \pi x^3}\right)^{1/2} exp \left( - \frac{\lambda (x-\mu)^2}{2 \mu^2 x} \right) $$
ソースコード
namespace ExRandom.Continuous {
public class InverseGaussRandom : Random{
readonly MT19937 mt;
readonly NormalRandom nd;
readonly double mu, lambda;
public InverseGaussRandom(MT19937 mt, double lambda = 1, double mu = 1) {
if(mt == null) {
throw new ArgumentNullException();
}
if(!(mu > 0) || !(lambda > 0)) {
throw new ArgumentException();
}
this.mt = mt;
this.nd = new NormalRandom(mt);
this.mu = mu;
this.lambda = lambda;
}
public override double Next() {
double x, y, z, w;
x = nd.Next();
y = x * x * mu;
z = mt.NextDouble();
w = mu - (0.5 * mu / lambda) * (Math.Sqrt(y * (y + 4.0 * lambda)) - y);
return (z < (mu / (mu + w))) ? w : (mu * mu / w);
}
}
}
関連項目
メルセンヌ・ツイスタ
各種確率分布サンプリング基本クラス