2016-08-01 82 views
0

我有一个模拟事件发生的程序。我有以下限制:用刻度线模拟模拟泊松分布的随机因子

  • 分布应该近似为Poisson distribution,即以固定速率发生的独立事件。
  • 在1000时刻,事件应该发生了100次(平均)。 (1000和100是占位符,真正的数字来自真实世界的系统我试图模拟实验确定。)

我目前使用以下形式的代码:

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

我使用while而不是if来模拟这些事件是独立的想法。否则,在同一个勾号中不会有两个事件发生。但是,我怀疑这意味着random() < 0.1(其中random返回半开范围内的数字[0.0, 1.0))稍微不准确。 (这没关系,我正在量化的事件发生时间。)

有人可以建议正确random() < f不变,如果我想使用(一般情况下)的泊松分布,使得在时间t会有事件计数e ?我相信存在这样一个恒定的f,但它的推导对我来说并不明显。

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

+0

语言偏好?因为泊松分布很容易获得,所以有很多语言,例如, [C++](http://en.cppreference.com/w/cpp/numeric/random/poisson_distribution)。也就是说,我看到的最大问题是,你完全忽略了**两个**事件的可能性,当然这很可能(〜1%)。 – MSalters

+0

您是否考虑过放弃固定增量时间提前量并转到事件调度机制?然后,您可以使用指数事件间时间,事件发生时会发生。固定增量时间提前量[已知会产生建模伪像](http://www.informs-sim.org/wsc11papers/218.pdf),即模型中偏离现实世界行为的行为。 – pjs

+0

@pjs不是我的泊松过程吗?所以@Piquan必须首先通过泊松分布以100/1000的时间间隔抽样事件数量,然后将事件统一放置 –

回答

0

正如MSalters在评论中指出的那样,即使使用&lambda; = 100/1000 = 0.1,那么在您的时钟的单个刻度中有多次出现的可能性很大。我为给定的&lambda;生成了泊松累积概率。这些显示了单个刻度中多个事件的逐渐稀少性。您可以通过一个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,他们或许可以被安全地忽略,除非你”重新做了一个荒谬的时间滴答声。如果您不担心更高数量的罕见病例,可以减少病例数量。

我还是建议用指数事件间隔时间的事件调度方法(使用相同的&拉姆达)—让他们碰巧—但上述的方法将工作的事件发生,如果你只是爱坚持使用的时间步长。