我正在嘗試生成一系列符合指數分佈的隨機數。幸運的是,C++提供了這樣的模板類exponential_distribution
,它可以根據指數分佈生成浮點值,提供平均值(即到達率)的倒數。另一方面,每個生成的值表示兩個隨機事件之間的間隔,這兩個隨機事件是獨立的,但是由恆定的平均到達速率即其λ,λ統計定義。所以lambda是平均值的倒數。C++ exponential_distribution模板類生成不準確的隨機數
生成這樣的隨機值後,我想檢查生成的隨機數是否準確,所以我根據生成的隨機數到達率計算lambda' = the number of generated randoms (number of arrivals)/the sum of the generated randoms (time duration)
,這是到達率。
然而結果證明lambda
和lambda'
是非常不同的。以下是我的代碼,其中lambda=20.0
。
#include<iostream>
#include<random>
#include<fstream>
#include<map>
using namespace std;
int main(){
mt19937 mt; //The Mersenne Twister is a pseudorandom number generator (PRNG), default_seed is a member constant, defined as 5489u;
exponential_distribution<double> exponential_intervals(20.0);
double interval;
double timestamp = 0;
for(int j = 0; j < 20; j ++){
interval = exponential_intervals(mt);
cout<<interval<<endl;
timestamp += interval; //generate exponentional distribution randoms, in micro seconds
}
return 0;
}
所生成的隨機量是:
0.118112
0.0900931
0.00679023
0.173476
0.122309
0.0124894
0.0500325
0.0184205
0.00513157
0.0396175
0.016321
0.0104363
0.0395801
0.247252
0.157921
0.2822
0.167461
0.171627
總和1.82
,所以lambda'=20/1.82=10.98
,這是從lambda
如此不同。
有人能告訴我如何提高生成的隨機數的準確性嗎?
不完全是一個大樣本 – 2014-11-01 09:29:15
生成的隨機量的「精度」是用詞不當。而且你的測試遠不是關於給定的樣本是否符合給定分佈的真實統計測試。 – 2014-11-01 12:58:55
@EdHeal如果我只想要20個指數分佈的隨機數? – Bloodmoon 2014-11-01 15:09:39