代码之家  ›  专栏  ›  技术社区  ›  blank

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

  •  8
  • blank  · 技术社区  · 16 年前

    我知道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 回复  |  直到 13 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

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

    看看 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();
    }
    
        2
  •  0
  •   er0    12 年前

    正如Scott提到的,您正在生成的泊松随机数表示事件的频率。获得频率后,可以使用第二个分布(如均匀分布)来拟合其在整个间隔内的出现次数。

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

    |<--------------------------N------------------------------------------->|

    要做到这一点,只需生成(k+1)个随机数,然后除以它们的和,再除以N。这些数字中的前k个成为事件的时间戳。