模拟泊松等待时间

发布于 2024-11-17 13:41:54 字数 488 浏览 4 评论 0原文

我需要模拟泊松等待时间。我发现了许多模拟到达数量的示例,但我需要在给定平均等待时间的情况下模拟一次到达的等待时间。

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

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 类中可用的方法,那就最好了,但这不是必需的。

I need to simulate Poisson wait times. I've found many examples of simulating the number of arrivals, but I need to simulate the wait time for one arrival, given an average wait time.

I keep finding code like this:

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; 
} 

but that is for number of arrivals, not arrival times.

Efficieny is preferred to accuracy, more because of power consumption than time. The language I am working in is Java, and it would be best if the algorithm only used methods available in the Random class, but this is not required.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小瓶盖 2024-11-24 13:41:54

到达之间的时间呈指数分布,您可以使用以下公式生成随机变量 X~exp(lambda)

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

更多信息请参阅 生成指数变量

请注意,到达之间的时间也与首次到达之间的时间相匹配,因为指数分布是无记忆

Time between arrivals is an exponential distribution, and you can generate a random variable X~exp(lambda) with the formula:

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

More info on generating exponential variable.

Note that time between arrival also matches time until first arrival, because exponential distribution is memoryless.

一口甜 2024-11-24 13:41:54

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

更容易做的事情是模拟到达间隔:

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

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

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

If you want to simulate earthquakes, or lightning or critters appearing on a screen, the usual method is to assume a Poisson Distribution with an average arrival rate λ.

The easier thing to do is to simulate inter-arrivals:

With a Poisson distribution, the arrivals get more likely as time passes. It corresponds to the cumulative distribution for that probability density function. The expected value of a Poisson-distributed random variable is equal to λ and so is its variance.
The simplest way is to 'sample' the cumulative distribution which has an exponential form (e)^-λt which gives t = -ln(U)/λ. You choose a uniform random number U and plug in the formula to get the time that should pass before the next event.
Unfortunately, because U usually belongs to [0,1[ that could cause issues with the log, so it's easier to avoid it by using t= -ln(1-U)/λ.

Sample code can be found at the link below.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文