我正在对我们在整个公司使用的负载测试框架进行一些修改,这是一个我希望得到答案的问题。
我的印象是,以下两种生成泊松分布的方法是等价的,但我显然是错的:
#!/usr/bin/env python
from numpy import average, random, std
from random import expovariate
def main():
for count in 5.0, 50.0:
data = [random.poisson(count) for i in range(10000)]
print 'npy_poisson average with count=%d: ' % count, average(data)
print 'npy_poisson std_dev with count=%d: ' % count, std(data)
rate = 1 / count
data = [expovariate(rate) for i in range(10000)]
print 'expovariate average with count=%d: ' % count, average(data)
print 'expovariate std_dev with count=%d: ' % count, std(data)
if __name__ == '__main__':
main()
这会产生如下输出:
npy_poisson average with count=5: 5.0168
npy_poisson std_dev with count=5: 2.23685443424
expovariate average with count=5: 4.94383067075
expovariate std_dev with count=5: 4.95058985422
npy_poisson average with count=50: 49.9584
npy_poisson std_dev with count=50: 7.07829565927
expovariate average with count=50: 50.9617389096
expovariate std_dev with count=50: 51.6823970228
为什么我使用内置的random.expovariate标准偏差与给定间隔内的事件数成比例,而expovariate std_deviation以log base 10(count)的速率进行缩放?
跟进问题:如果您模拟用户与您的服务互动的频率,哪一个更合适?
答案 0 :(得分:4)
因为你的假设是错误的。泊松分布的均值/方差均为lambda
,因此stdev
为sqrt(lambda)
。指数分布的均值/方差分别为1/lambda
和1/lambda^2
。所以std = sqrt(1/(1/rate)^2) = sqrt(rate^2) = rate
正是你在这里看到的。
我建议您阅读queuing theory上的维基百科文章,了解您的后续问题。