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

谢谢,是的,这是完全有道理的 –