ウィグナー半円分布サンプリング; Wigner Semicircle Distribution Sampling
概要
ウィグナー半円分布とは以下の式で表現される確率分布。確率密度関数は半円の名の通りの形状をしている。
$$f(x)=\frac{2}{\pi s^2} \sqrt{s^2-x^2}, \quad |x| \leq s $$
ウィグナー半円分布に従う確率変数の生成にはJohn von Neumannの棄却法を用いる。採択率は\(\pi/4\)なので逆関数法を使わずとも十分高速になる。
ソースコード
namespace ExRandom.Continuous {
public class WignerSemicircleRandom : Random {
readonly MT19937 mt;
readonly UniformRandom ud;
readonly double s;
public WignerSemicircleRandom(MT19937 mt, double s = 1) {
if(mt == null) {
throw new ArgumentNullException();
}
if(!(s > 0)) {
throw new ArgumentException();
}
this.mt = mt;
this.ud = new UniformRandom(mt, -1, 1);
this.s = s;
}
public override double Next() {
double r, thr;
do {
r = ud.Next();
thr = Math.Sqrt(1 - r * r);
} while(!mt.NextBool(thr));
return r * s;
}
}
}
関連項目
メルセンヌ・ツイスタ
各種確率分布サンプリング基本クラス
連続一様分布サンプリング