【发布时间】:2009-11-13 11:43:53
【问题描述】:
我需要从 Binomial(n, p) 分布中生成随机数。
Binomial(n, p) 随机变量是 n 个均匀变量的总和,这些变量以概率 p 取 1。在伪代码中,x=0; for(i=0; I<n; ++I) x+=(rand()<p?1:0); 会生成一个 Binomial(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?您是如何选择该发行版的? -
是的,对于大 n。 Binomial(n,lambda/n) 收敛到 Poisson(lambda),因为 n 趋于无穷大。