2010-02-05 181 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就成为你事件的时间戳。