random.expovariate(rate)和numpy.random.poisson(quantity)的平均值相同,但分布大相径庭,为什么?

1 投票
1 回答
3694 浏览
提问于 2025-04-17 14:17

我正在对我们公司使用的负载测试框架进行一些修改,这里有个问题我很想知道答案。

我原以为下面这两种生成泊松分布的方法是等价的,但显然我错了:

#!/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 的标准差却是以 10 为底的对数(count)来变化的呢?

后续问题:如果你是在模拟用户与服务互动的频率,哪种方法更合适呢?

1 个回答

4

因为你的假设是错误的。泊松分布的平均值和方差都是 lambda,所以标准差 stdevsqrt(lambda)。而指数分布的平均值和方差分别是 1/lambda1/lambda^2。所以标准差的计算是 std = sqrt(1/(1/rate)^2) = sqrt(rate^2) = rate,这正是你在这里看到的结果。

我建议你去看看维基百科上关于 排队理论的文章,可能对你后续的问题有帮助。

撰写回答