二項分布(n、p)から乱数を生成する必要があります。C#:二項分布から数値を生成する数値アルゴリズム
確率変数は、確率pで1をとるn個の均一変数の合計です。擬似コードでは、x=0; for(i=0; i<n; ++i) x+=(rand()<p?1:0);
は、二項(n、p)を生成します。
これは、n = 10^6やp = 0.02のように小さくて実際に大きなnに対して生成する必要があります。それを生成する任意の高速数値アルゴリズムはありますか?
EDIT -
今これは私が(正確なポアソンと正規分布のための関数と一緒に)近似値として持っているものである -
public long Binomial(long n, double p) {
// As of now it is an approximation
if (n < 1000) {
long result = 0;
for (int i=0; i<n; ++i)
if (random.NextDouble() < p) result++;
return result;
}
if (n * p < 10) return Poisson(n * p);
else if (n * (1 - p) < 10) return n - Poisson(n * p);
else {
long v = (long)(0.5 + nextNormal(n * p, Math.Sqrt(n * p * (1 - p))));
if (v < 0) v = 0;
else if (v > n) v = n;
return v;
}
}
ポアソン分布は、 'n * p <10'や' n *(1-p)<10'でうまくいくのでしょうか?どのようにあなたはその流通を選ぶでしょうか? – HelloGoodbye
はい、大規模なnの場合。 nが無限大になると、二項(n、λ/ n)はポアソン(λ)に収束する。 – KalEl