我實現這個功能,以生成泊松隨機變量生成泊松變量++
typedef long unsigned int luint;
luint poisson(luint lambda) {
double L = exp(-double(lambda));
luint k = 0;
double p = 1;
do {
k++;
p *= mrand.rand();
} while(p > L);
return (k-1);
}
其中mrand是梅森旋轉算法的隨機數發生器。我發現,隨着我增加lambda,預期的分佈將會出現錯誤,平均值達到750左右。這是由於數值逼近還是我犯了錯誤?
IIRC,泊松變量具有指數分佈。因此,這是http://stackoverflow.com/questions/2106503/pseudorandom-number-generator-exponential-distribution的精確副本。但即使我錯了,那裏給出的方法也應該起作用。 – MSalters 2011-04-14 09:09:18
@ MSalters:泊松分佈是離散的 - 它只需要整數值。指數分佈是連續的。所以他們不一樣(雖然他們是相關的)。 – TonyK 2011-04-14 11:16:20
維基百科的權利:「如果給定時間間隔[0,t]內的到達數量遵循泊松分佈,平均值=λt,那麼到達間隔時間的長度將遵循指數分佈,平均值爲1/λ「。這是兩者之間的有效轉換,在結構上類似於我在下面提出的算法。 – MSalters 2011-04-14 11:57:12