我有一个模拟事件发生的程序。我有以下限制:
我目前正在使用以下格式的代码:
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
中更合适,请告诉我。
答案 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>