2009-11-13 80 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分享嗎?