如何生成具有泊松分布的离散随机事件?

我知道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; } 

如果您希望模拟事件间到达时间,则需要指数分布。

看一下Pseudorandom Number Generator – 指数分布

您的代码将如下所示:

 // 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(); } 

正如斯科特所提到的,您生成的泊松随机数代表了事件的频率。 一旦你有了频率,就可以使用第二个分布,比如Uniform,在整个时间间隔内拟合它们的出现次数。

假设为N的间隔生成的事件数是k。 然后你只需要生成总和为N的(k + 1)个随机数。

| <----------------------- N ------------------------ - > |
–r_0 – (事件)— R_1 -..-(event_k) – R_(K + 1) –

为此,只需生成(k + 1)个随机数并将它们除以它们的和除以N.这些数字的前k个成为事件的时间戳。