2016-09-29 77 views
1

我想在我的項目範圍(0,1)中生成高質量的隨機數,我試圖從here的示例代碼中測試uniform_real_distribution。當我運行它,它工作得很好的代碼,但是當我試圖修改同與播種發生器,如:uniform_real_distribution不給予均勻分佈

#include <random> 
#include <iostream> 
#include <chrono> 

using namespace std; 
// obtain a seed from the system clock: 
unsigned seed = static_cast<int> (chrono::system_clock::now().time_since_epoch().count()); 

// globally defining the generator and making it static for safety because in the 
// actual project this might affect the flow. 

static default_random_engine gen(seed); 
uniform_real_distribution<double> distribution(0.0,1.0); 

int main(){ 
    const int nrolls=10000; // number of experiments 
    const int nstars=95;  // maximum number of stars to distribute 
    const int nintervals=10; // number of intervals 

    int p[nintervals]={}; 

    for (int i=0; i<nrolls; ++i) { 
    double number = distribution(gen); 
    ++p[int(nintervals*number)]; 
    } 

    std::cout << "uniform_real_distribution (0.0,1.0):" << std::endl; 
    std::cout << std::fixed; std::cout.precision(1); 

    for (int i=0; i<nintervals; ++i) { 
    std::cout << float(i)/nintervals << "-" << float(i+1)/nintervals << ": "; 
    std::cout << std::string(p[i]*nstars/nrolls,'*') << std::endl; 
    } 

    return 0; 

} 

隨機數並沒有均勻分佈。

F::同樣重複執行時的輸出\路徑> randtest

uniform_real_distribution(0.0,1.0):

0.0-0.1:*********

0.1-0.2:**********

0.2-0.3:********

0.3-0.4:******** *

0.4-0.5:*********

0.5-0.6:*********

0.6-0.7:******** *

0.7-0.8:*********

0.8-0.9:*********

0.9-1.0:******* ***

F:\ path> randtest

uniform_real_distribution(0.0,1.0):

0.0-0.1:*********

0.1-0.2:*********

0.2〜 0.3:*********

0.3-0.4:*********

0.4-0.5:*********

0.5 -0.6:*********

0.6-0.7:*********

0.7-0.8:*********

0.8-0.9:*********

0.9-1.0:*********

F:\路徑> randtest

uniform_real_distribution(0.0,1.0):

0.0-0.1:**** *****

0.1-0.2:*********

0.2-0。3:*********

0.3-0.4:*********

0.4-0.5:**********

0.5-0.6:*********

0.6-0.7:*********

0.7-0.8:*********

0.8-0.9:*********

0.9-1.0:*********

是因爲播種嗎?還是使用不同的發生器更好?

我使用G ++ 5.1.0編譯器C++ 11標準。

+4

這對我來說看起來很統一。你是否期望每次結果均勻分佈? –

+0

是的。這個函數會被稱爲多次,每個結果都會相互比較,所以有辦法讓它完美分佈嗎? – akki

+2

諮詢統計學家是否對你非常重要,但我猜你的樣本太小。當我將'nrolls'增加10倍時,我得到一個視覺上均勻的分佈。 – RegularlyScheduledProgramming

回答

9

如果您翻轉了一枚硬幣並將它降落,您下次翻轉時是否會始終落在尾巴上?

一枚硬幣在集合{heads, tails}上產生均勻分佈。這並不意味着任何一組翻轉,頭部和尾部的數量是相等的。事實上,發生這種情況的機會正好下降當你翻轉更多的硬幣。

就你而言,每個間隔有10%的機會被選中。

這種選擇的方差是(0.1)(1-.1)或0.09。

預期值爲0.1。

後10000次的嘗試中,預期值將是1000

臨屋方差將是900

900方差對應於30

的95-標準偏差ish%置信區間是2個標準偏差(實際上是1.96,但是誰在乎)。

所以你應該期望的值典型地是940和1060之間

隨着95分,每顆星對應於九十五分之萬= 105元素。

一百零五分之九百四十〇約爲8.95 一百零五分之一千零六十零約爲10.06

所以你通常8和10位明星在每列之間看到。假設四捨五入,即使在10個反相關樣本上,達到7或11顆星也應該是非常罕見的(因爲這是3個SD距離)。

這一切都假定一個完美的均勻隨機分佈。由於這種模型是你觀察到的行爲,你的問題是數學和統一的定義隨機分佈,而不是C++語言。

如果你想要一個完美的直方圖,不要使用均勻的隨機分佈。例如,您可以簡單地從0開始,然後每次添加0.0001。 10001通話後,您將擁有從0到1的統一直方圖。

統一隨機只是意味着每個地區的機會是相同的。

+1

http://onlinestatbook.com/2/calculators/normal_dist.html表示normal = 1000,sd = 30,range = 945-1050 - > 91.88%應該有9顆星。 8星,3.334%,10星,4.78%。這似乎很好地匹配他的例子 –

+0

@Yakk謝謝你的解釋。我對這個數學主題很陌生,你的回答幫助我更好地理解。 – akki