我有 N 个进程,每个进程都有不同的泊松率。我想模拟所有 N 个进程的到达时间。如果 N =1 我可以做到这一点
t = 0
N = 1
for i in range(1,10):
t+= random.expovariate(15)
print N, t
但是,如果我有 N = 5
和一个费率列表
rates = [10,1,15,4,2]
我想以某种方式让循环以正确的顺序输出所有 N 个进程的到达时间。也就是说,我仍然希望每行只有两个数字(进程 ID 和到达时间),但按到达时间全局排序。
我可以制作 N 个列表然后合并它们,但我希望首先以正确的顺序输出到达时间。
更新。一个问题是,如果您只是从每个流程中抽取固定数量的到达样本,您只能从高速率流程中获得早期时间。所以我认为我需要从每个过程的固定时间间隔进行采样,因此样本数量会根据速率而变化。
最佳答案
如果我没理解错的话:
import random
import itertools
def arrivalGenerator(rate):
t = 0
while True:
t += random.expovariate(rate)
yield t
rates = [10, 1, 15, 4, 2]
t = [(i, 0) for i in range(0, len(rates))]
arrivals = []
for i in range(len(rates)):
t = 0
generator = arrivalGenerator(rates[i])
arrivals += [(i, arrival) \
for arrival in itertools.takewhile(lambda t: t < 100, generator)]
sorted_arrivals = sorted(arrivals, key=lambda x: x[1])
for arrival in sorted_arrivals:
print arrival[0], arrival[1]
请注意,您的初始逻辑是为每个流程生成固定数量的到达。您真正想要的是一个特定的时间窗口,并为给定的进程持续生成,直到您超过该时间窗口。
关于python - 模拟多个泊松过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17491448/