2010-02-05 89 views
7

我知道Knuth的算法用於生成隨機泊松分佈式數字(下面用Java),但是如何隨着時間的推移隨機隨機調用方法generateEvent()如何用泊松分佈生成離散隨機事件?

int poissonRandomNumber(int lambda) { 
    double L = Math.exp(-lambda); 
    int k = 0; 
    double p = 1; 
    do { 
     k = k + 1; 
     double u = Math.random(); 
     p = p * u; 
    } while (p > L); 
    return k - 1; 
} 

回答

2

如果您希望模擬事件間到達時間,您需要指數分佈。

看看Pseudorandom Number Generator - Exponential Distribution

你的代碼應該是這樣的:

// Note L == 1/lambda 
public double poissonRandomInterarrivalDelay(double L) { 
    return (Math.log(1.0-Math.random())/-L; 
} 

...

while (true){ 
    // Note -- lambda is 5 seconds, convert to milleseconds 
    long interval= (long)poissonRandomInterarrivalDelay(5.0*1000.0); 
    try { 
     Thread.sleep(interval); 
     fireEvent(); 
} 
+0

嗨,我需要生成隨機數在泊松區間率使用java ..我試着用你的函數和方法poissonRandomInterarrivalDelay總是返回零任何lambda值。 – Learner 2013-05-15 17:55:07

+0

你可以發佈你的代碼作爲一個新的問題嗎?也許我可以看到一些東西...... – 2013-05-17 00:54:10

+0

我無法做到這一點。我目前被阻止.. – Learner 2013-05-17 14:39:28

0

您正在生成,斯科特提到的泊松隨機數,代表您事件的頻率。一旦你有了頻率,你就可以使用第二種分佈來適應它們的發生率,比如說Uniform。

假設對於區間N生成的事件數是k。然後,您只需生成總計爲N的(k + 1)個隨機數。

| < ----------------------- N ------------------------- > |
--r_0 - (event)--- r_1 -..-(event_k) - r_(k + 1)他們的總和除以N.這些數字的第一個k就成爲你事件的時間戳。