我需要從二項式(n,p)分佈生成隨機數。C#:從二項式分佈生成數字的數值算法
二項式(n,p)隨機變量是n個均勻變量的和,其中1取概率p。在僞代碼中,x=0; for(i=0; i<n; ++i) x+=(rand()<p?1:0);
將生成二項式(n,p)。
我需要生成這個小的以及非常大的n,例如n = 10^6和p = 0.02。有沒有快速的數值算法來生成它?
編輯 -
現在這是我作爲近似(以及用於精確泊松和正態分佈函數) -
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 2014-03-06 13:44:17
是的,對於大n。隨着n變爲無窮大,二項式(n,lambda/n)收斂於泊松(lambda)。 – KalEl 2014-03-27 03:31:35