1

会社全体で使用している負荷テスト フレームワークにいくつかの変更を加えています。

ポアソン分布を生成する次の 2 つのアプローチは同等であるという印象を受けましたが、明らかに間違っています。

#!/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 は対数ベース 10 (カウント) の割合でスケーリングされるのはなぜですか??

フォローアップの質問: ユーザーがサービスを操作する頻度をシミュレートする場合、どちらがより適切ですか?

4

1 に答える 1

4

あなたの仮定が間違っているからです。ポアソン分布の平均/分散は両方lambdaであるため、stdevは ですsqrt(lambda)。指数分布の平均 / 分散はそれぞれ1/lambdaおよび1/lambda^2です。つまりstd = sqrt(1/(1/rate)^2) = sqrt(rate^2) = rate、まさにあなたがここで見ているものです。

フォローアップの質問については、待ち行列理論に関するウィキペディアの記事を読むことをお勧めします。

于 2013-01-31T08:11:38.080 に答える