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

时间:2010-02-05 09:33:25

标签: java events simulation poisson

我知道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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

正如斯科特所提到的,您生成的泊松随机数代表了事件的频率。获得频率后,您可以使用第二个分布(例如Uniform。)来确定它们在区间内的出现次数。

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

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

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