8

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

2 回答 2

4

如果您正在寻找模拟事件间到达时间,您需要指数分布。

看看伪随机数生成器 - 指数分布

您的代码将如下所示:

// 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();
}
于 2011-04-10T23:59:17.520 回答
0

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

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

|<------------------------ 否 ------------------------ ->|
--r_0--(事件)---r_1-..-(事件_k)--r_(k+1)--

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

于 2013-11-15T03:22:40.757 回答