如何生成泊松过程?

bia*_*ias 11 c++ random poisson stochastic-process

原始问题:

我想生成一个泊松过程.如果到时间t的到达次数是N(t)并且我有一个带参数λ的泊松分布,我该如何产生N(t)?我将如何在C++中执行此操作?

澄清:

我原本想用泊松分布生成过程.但是,我对我需要的过程中的参数感到困惑; 我以为我可以使用N(t),但是它告诉我在间隔(0,t)上发生了多少到达,这不是我想要的.所以,我认为我可以使用N(t2)-N(t1) )获得区间[t1,t2]上的到达次数.由于N(t)〜泊松(tx lambda),我可以使用Poisson(t2 x lambda)-Poisson(t1 x lambda)但我不希望一个区间内的到达人数.

相反,我想生成到达时出现的明确时间.

我可以通过使间隔[t2,t1]足够小以使每个间隔只有一个到达(发生为| t2-t1 | - > 0)来做到这一点.

小智 22

如果你有一个带速率参数L的泊松过程(意味着,长期,每秒有L个到达),则到达间隔时间是指数分布的,平均值为1/L. 因此PDF是f(t)= -L*exp(-Lt),并且CDF是F(t)= Prob(T <t)= 1-exp(-Lt).所以你的问题变成了:如何生成一个随机数t,其分布为F(t)= 1 - \exp(-Lt)?

假设您使用的语言具有一个函数(让我们称之为rand())来生成均匀分布在0和1之间的随机数,则逆CDF技术将减少到计算:

-log(rand()) / L
Run Code Online (Sandbox Code Playgroud)

由于python提供了生成指数分布随机数的函数,因此您可以模拟泊松过程中的前10个事件,每秒15个到达率的平均速率如下:

import random
for i in range(1,10):
   print random.expovariate(15)
Run Code Online (Sandbox Code Playgroud)

请注意,这将产生*inter*到达时间.如果你想要到达时间,你必须像这样继续向前移动一个时间变量:

import random
t= 0
for i in range(1,10):
   t+= random.expovariate(15)
   print t
Run Code Online (Sandbox Code Playgroud)

  • 计算`log(rand())`时,请确保不要取log 0。一个常见的技巧是改为计算log(1.0-rand()),因为rand()通常会返回一个小于1的数字。 (2认同)

Joh*_*ook 5

这是使用C ++ TR1生成泊松样本的样本代码。

如果需要泊松过程,则到达之间的时间呈指数分布,并且可以使用逆CDF方法简单地生成指数值:-k * log(u)其中u是统一随机变量,k是指数均值。

  • 好点子。如果需要泊松过程,则到达之间的时间呈指数分布,并且可以使用逆CDF方法简单地生成指数值:-k * log(u)其中u是统一随机变量,k是指数均值。 (4认同)