【问题标题】:Simulating Poisson Waiting Times模拟泊松等待时间
【发布时间】:2011-06-29 21:15:20
【问题描述】:

我需要模拟泊松等待时间。我找到了很多模拟到达数量的例子,但是我需要模拟一个到达的等待时间,给定一个平均等待时间。

我一直在寻找这样的代码:

public int getPoisson(double lambda) 
{   
    double L = Math.exp(-lambda);   
    double p = 1.0;   
    int k = 0;   

    do 
    {    
        k++;     
        p *= rand.nextDouble(); 
        p *= Math.random(); 
    } while (p > L);   

    return k - 1; 
} 

但这是到达次数,而不是到达时间。

效率优于准确性,更多是因为功耗而不是时间。我使用的语言是 Java,如果算法只使用 Random 类中可用的方法,那将是最好的,但这不是必需的。

【问题讨论】:

标签: java poisson


【解决方案1】:

到达之间的时间是指数分布,你可以用公式生成一个随机变量X~exp(lambda)

-ln(U)/lambda` (where U~Uniform[0,1]). 

更多关于generating exponential variable的信息。

请注意,到达之间的时间也与第一次到达之前的时间相匹配,因为指数分布是memoryless

【讨论】:

  • 谢谢,但有些不对劲;当我用 1/100 调用它时,我每次都会得到 Infinity 的值。代码是 public static double waitingTime(double lambda) { return -Math.log(rand.nextDouble())/lambda;说每单位时间预计少于一个到达不是有效的吗?还是我输入 1 并乘以预期的等待时间?
  • @Alex:我只有 99% 的把握,但我认为在指数分布中,lamda 是每个时间单位的出现次数,如果你有平均等待时间,你应该设置lamda=1/average waiting time,可以这是问题所在?
  • 没关系,我总是犯这个错误。我用 1/100 而不是 1.0/100.0 调用该方法 这个答案有效。非常感谢您,我已经阅读stackoverflow 很长时间了,这是我第一次发帖,我很惊讶您的回答如此快速和准确。
【解决方案2】:

如果要模拟屏幕上出现的地震、闪电或小动物,通常的方法是假设平均到达率 λ 的泊松分布。

更简单的做法是模拟到达时间:

使用泊松分布,随着时间的推移,到达的可能性更大。它对应于该概率密度函数的累积分布。泊松分布的随机变量的期望值等于 λ,它的方差也是如此。 最简单的方法是“采样”具有指数形式 (e)^-λt 的累积分布,它给出 t = -ln(U)/λ。您选择一个统一的随机数 U 并插入公式以获取在下一个事件之前应该经过的时间。 不幸的是,由于 U 通常属于 [0,1[ 这可能会导致日志出现问题,因此使用 t= -ln(1-U)/λ 更容易避免它。

可以在下面的链接中找到示例代码。

https://stackoverflow.com/a/5615564/1650437

【讨论】:

  • 嗨,我需要使用 java 生成泊松间隔率中的随机数。我尝试使用你的函数和方法 poissonRandomInterarrivalDelay 对于任何 lambda 值总是返回零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多