2016-07-05 68 views
3

我玩了一點C++隨機引擎,有什麼讓我不高興。 已經注意到,我所擁有的值是大致相同的順序,我做了如下試驗:C++隨機引擎不是真的隨機

#include <random> 
#include <functional> 
#include <iostream> 

int main() 
{ 
    auto res = std::random_device()(); 
    std::ranlux24 generator(res); 
    std::uniform_int_distribution<uint32_t> distribution; 
    auto roll = std::bind(distribution, generator); 


    for(int j = 0; j < 30; ++j) 
    { 
     double ssum = 0; 
     for(int i = 0; i< 300; ++i) 
     { 
      ssum += std::log10(roll()); 
     } 
     std::cout << ssum/300. << std::endl; 
    } 
    return 0; 
} 

,我打印的值均約9.2看起來更像是一個正態分佈,發動機我用什麼的。 有沒有我沒有正確理解的東西? 謝謝, 紀堯姆

+1

你爲什麼要用'log10'?這不會顯着影響分佈的形狀嗎? –

+2

根據您使用的生成器,您可能需要多次調用'random_device'來正確地播種所有內部狀態。例如,'std :: mt19937'使用624字節的內部狀態,所以你需要一個'std :: seed_seq'和多個輸入來播種所有的內容。參見http://stackoverflow.com/questions/15509270/does-stdmt19937-require-warmup –

+7

另請參閱[中心極限定理](https://en.wikipedia.org/wiki/Central_limit_theorem)。你對一個隨機數發生器的結果進行平均*。 「獨立隨機變量迭代數量足夠大的算術平均數,每個都有一個定義良好的(有限的)期望值和有限的方差,將近似正態分佈,而與基本分佈無關。」你在* 300 *隨機分佈的獨立變量上取平均值。 – jaggedSpire

回答

14

注意到這一點,我有值均大致相同順序

。這是你一個統一的隨機數發生器期待什麼。在範圍[10 ^(n-1),10^n)內的整數的數量是[0,10 ^(n-1)範圍內的整數的9倍)。

+0

謝謝,是的,這是完全有道理的 –