2009-11-13 71 views
8

我需要从二项式(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; 
     } 
    } 

+0

对于n * p <10或n *(1-p)<10',泊松分布是否适用?你如何选择这种分配? – HelloGoodbye 2014-03-06 13:44:17

+0

是的,对于大n。随着n变为无穷大,二项式(n,lambda/n)收敛于泊松(lambda)。 – KalEl 2014-03-27 03:31:35

回答

4

如果您愿意付款,那么请查看Centerspace的NMath

否则,由统计程序R用于C代码是here,而且应该是简单地移植到C#。

编辑:在Jack Xu的的p178上为此创建了一个方法的详细信息(包括代码)。

另一编辑:A free C# library这就是你想要的。

3

有没有明显的方法有效地做到这一点。对于小的n,你可能只是我们计算逆PDF的公式。对于较大的n,您可能最好使用易于计算的approximations to other distributions之一。

+0

我实际上使用了一些我使用泊松和正态分布编写的adhoc近似例程。不过,我不确定它产生的数字在统计上离真正的二项式有多远。我已将我的代码添加为编辑。 – KalEl 2009-11-13 12:19:27

4

另一种选择是因为你做的,从正常或泊松样品,然后添加一个Metropolis-Hastings一步接受或拒绝您的样品。如果你接受你完成了,如果你拒绝,你必须再次完全重新采样。我的猜测是,因为近似值很接近,你几乎总是会接受一个接受步骤,偶尔你可能会拒绝。

另外Luc Devroye's book有一些伟大的二项式采样算法。

PS如果最终得到一个好的算法;你会介意在Math.Net Numerics分享吗?