2014-11-01 26 views
0

我正在嘗試生成一系列符合指數分佈的隨機數。幸運的是,C++提供了這樣的模板類exponential_distribution,它可以根據指數分佈生成浮點值,提供平均值(即到達率)的倒數。另一方面,每個生成的值表示兩個隨機事件之間的間隔,這兩個隨機事件是獨立的,但是由恆定的平均到達速率即其λ,λ統計定義。所以lambda是平均值的倒數。C++ exponential_distribution模板類生成不準確的隨機數

生成這樣的隨機值後,我想檢查生成的隨機數是否準確,所以我根據生成的隨機數到達率計算lambda' = the number of generated randoms (number of arrivals)/the sum of the generated randoms (time duration),這是到達率。

然而結果證明lambdalambda'是非常不同的。以下是我的代碼,其中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如此不同。

有人能告訴我如何提高生成的隨機數的準確性嗎?

+7

不完全是一個大樣本 – 2014-11-01 09:29:15

+0

生成的隨機量的「精度」是用詞不當。而且你的測試遠不是關於給定的樣本是否符合給定分佈的真實統計測試。 – 2014-11-01 12:58:55

+0

@EdHeal如果我只想要20個指數分佈的隨機數? – Bloodmoon 2014-11-01 15:09:39

回答

2

分佈的標準偏差與平均值mu = 1/lambda相同。記住中心極限定理,對於樣本大小N,樣本平均值的偏差將近似爲mu/sqrt(N)。對於20的樣本量來說,這個數字非常大 - 大概是你測量值的22% - 所以你可能會得到一個相當不準確的估計。

增加樣本量,也許到10000給出的1%左右的偏差,給出了一個更好的估計:http://ideone.com/9xjQwg

+0

我可以通過增加樣本大小來查看準確性。但是,如果我只想要20個具有指數分佈的隨機數呢? – Bloodmoon 2014-11-01 15:11:54

+0

這正是你所擁有的。如果你想讓它們根據分佈均勻分佈,那麼它們不再是隨機的。 – 2014-11-01 18:08:10