用刻度线模拟模拟泊松分布的随机因子
问题描述:
我有一个模拟事件发生的程序。我有以下限制:用刻度线模拟模拟泊松分布的随机因子
- 分布应该近似为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
中更合适,请告诉我。
答
正如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,他们或许可以被安全地忽略,除非你”重新做了一个荒谬的时间滴答声。如果您不担心更高数量的罕见病例,可以减少病例数量。
我还是建议用指数事件间隔时间的事件调度方法(使用相同的&拉姆达)—让他们碰巧—但上述的方法将工作的事件发生,如果你只是爱坚持使用的时间步长。
语言偏好?因为泊松分布很容易获得,所以有很多语言,例如, [C++](http://en.cppreference.com/w/cpp/numeric/random/poisson_distribution)。也就是说,我看到的最大问题是,你完全忽略了**两个**事件的可能性,当然这很可能(〜1%)。 – MSalters
您是否考虑过放弃固定增量时间提前量并转到事件调度机制?然后,您可以使用指数事件间时间,事件发生时会发生。固定增量时间提前量[已知会产生建模伪像](http://www.informs-sim.org/wsc11papers/218.pdf),即模型中偏离现实世界行为的行为。 – pjs
@pjs不是我的泊松过程吗?所以@Piquan必须首先通过泊松分布以100/1000的时间间隔抽样事件数量,然后将事件统一放置 –