在Java中生成Poisson到达

use*_*257 2 java poisson

我想在Java中创建一个函数,根据平均到达率(lambda)和平均服务率(mu)生成Poisson到达.

在我的例子中,我有:2,2个请求/天,换句话说2,2个到达/天,平均服务时间为108个小时.考虑到我的程序在t = 0分钟开始,我想创建一个返回到达[]的函数,它将包含t1,t2和一个可能的t3.T1,t2和t3是这些到达发生的白天的瞬间(以分钟为单位).我有以下限制:

t1 < t2 < t3 < 1440 minutes (24 hours*60 minutes/hour)

t2-t1 > 108 minutes

t3-t2 > 108 minutes

t3+ 108 minutes < 1440 minutes

有人可以帮帮我吗?

谢谢,

安娜

Ada*_*man 5

您可以使用D. Knuth提出的算法:

private static int getPoissonRandom(double mean) {
    Random r = new Random();
    double L = Math.exp(-mean);
    int k = 0;
    double p = 1.0;
    do {
        p = p * r.nextDouble();
        k++;
    } while (p > L);
    return k - 1;
}
Run Code Online (Sandbox Code Playgroud)

要理解这是如何工作的,请注意在k次迭代之后循环条件变为

p 1*p 2*...*p k > L.

这相当于

-ln(p 1)/ mean -ln(p 2)/ mean ... -ln(p k)/ mean> 1

注意,如果p均匀分布,则-ln(p)/ mean具有给定均值的指数分布.当事件之间的间隔长度是具有指数分布的独立随机变量时,具有泊松分布的随机变量等于给定事件在固定间隔内发生的次数.由于我们使用泊松分布的均值作为事件之间间隔的指数分布的均值,因此我们计算出现次数的固定内部是单位长度.因此,循环条件总结了事件之间间隔的长度,并检查我们是否超出了单位间隔.如果我们在计算第k个事件时已超出单位间隔,则在该区间内发生k-1个事件,因此我们返回k-1.


mik*_*era 0

下面是一些生成具有给定均值的泊松数的简化代码:

private static int poisson(double mean) {
    int r = 0;
    double a = random.nextDouble();
    double p = Math.exp(-mean);

    while (a > p) {
        r++;
        a = a - p;
        p = p * mean / r;
    }
    return r;
}
Run Code Online (Sandbox Code Playgroud)

您应该能够使用它或类似的东西来生成每个时间段的到达人数:输入应该是您期望在该时间段内到达的平均人数。

请注意,如果您的平均值非常大(例如 500+),您将需要使用正态分布来近似到达人数。这更有效,而且它避免了上面代码中固有的数字溢出问题(在某些时候 Math.exp(-mean) 会四舍五入到零......哎呀!)