2016-07-05 14 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

を参照してください。[central limit theorem](https://en.wikipedia.org/wiki/Central_limit_theorem)も参照してください。あなたは乱数ジェネレータの結果を平均化*しています。 「明確な(有限の)期待値と有限の分散を持つ独立した確率変数の十分に多数の反復の算術平均は、根底にある分布にかかわらず、ほぼ正規分布になります。あなたは* 300 *ランダムに分布した独立変数で平均をとっています。 – jaggedSpire

答えて

14

は私が持っていた値がほぼ同じ順序

のこれはあなたが一様乱数ジェネレータを期待する正確に何であるたことに気づきました。範囲[0,10 ^(n-1)]にある範囲の[10 ^(n-1)、10^n]の範囲に9倍の整数があります。

+0

ありがとうございます、はい、それは完全に意味をなさない –

関連する問題