使用刻度线模拟模拟泊松分布的随机因子

时间:2016-08-01 06:57:54

标签: math random simulation probability poisson

我有一个模拟事件发生的程序。我有以下限制:

  • 分布应接近Poisson distribution,即以固定利率发生的独立事件。
  • 在时间1000滴答时,事件应该发生100次(平均)。 (1000和100是占位符;实数是通过实验确定的,我试图建模的真实系统。)

我目前正在使用以下格式的代码:

def tick():
    doMaintenance()
    while random() < 0.1:
        eventHappens()

我使用while代替if来模拟这些事件是独立的想法。否则,在同一个滴答中不会发生两个事件。但是,我怀疑这意味着random() < 0.1(其中random返回半开放范围[0.0, 1.0)中的数字)稍微不准确。 (我可以量化事件发生时间。)

如果我想要(在一般情况下)Poisson分布,那么有人会建议使用正确的random() < f常数,以便在t时会有事件计数e吗?我相信这样的常数f存在,但它的推导对我来说并不明显。

我把它放在stackoverflow.com中,这样我就可以方便地用编码术语说话,因为我使用的是滴答滴答模拟,数学模拟程序员比数学家更熟悉。如果这在math.stackexchange.com中更合适,请告诉我。

1 个答案:

答案 0 :(得分:0)

正如MSalters在评论中指出的那样,即使λ= 100/1000 = 0.1,也很可能在你的时钟的单个刻度中出现多次。我为给定的λ生成泊松累积概率 - 这些概率表示单个刻度中多个事件的渐进罕见性。您可以使用它们通过if / else结构确定正确的事件数:

u = random()
if u ≤ 0.904837418
   // 0 events
else if u ≤ 0.9953211598
   // 1 event
else if u ≤ 0.9998453469
   // 2 events
else if u ≤ 0.9999961532
   // 3 events
else if u ≤ 0.9999999233
   // 4 events
else if u ≤ 0.9999999987
   // 5 events
else
   // 6 events

由于超过6个事件的概率低于10 -10 ,它们可能会被安全地忽略,除非你做了一个荒谬的时间滴答。如果你不担心计数较高的罕见病例,你可以减少病例数。

我仍然建议使用指数事件间时间(具有相同的λ)的事件调度方法 - 当事件发生时事件发生 - 但如果您只是坚持时间步骤,上面概述的方法将起作用。 / p>