【问题标题】:c++ random engines not really randomC++ 随机引擎不是真正随机的
【发布时间】:2016-11-07 10:13:20
【问题描述】:

我在玩一些 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,看起来更像是一个正态分布。 有什么我没有正确理解的吗? 谢谢, 纪尧姆

【问题讨论】:

  • 你为什么选择log10?这不会显着影响分布的形状吗?
  • 根据您使用的生成器,您可能需要多次调用 random_device 才能正确地为所有内部状态播种。例如,std::mt19937 使用 624 字节的内部状态,因此您需要一个 std::seed_seq 和多个输入来播种所有这些状态。参见例如stackoverflow.com/questions/15509270/…
  • 另见central limit theorem。您正在平均随机数生成器的结果。 “[The] 足够多的独立随机变量迭代的算术平均值,每个变量都有明确定义的(有限)期望值和有限方差,将近似正态分布,而不管基础分布如何。”您正在取 300 个随机分布的自变量的平均值。

标签: c++ c++11 random


【解决方案1】:

注意到我的值大致相同

这正是您对统一随机数生成器的期望。 [10^(n-1),10^n) 范围内的整数是 [0,10^(n-1)) 范围内的整数的 9 倍。

【讨论】:

  • 谢谢,是的,这完全有道理
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2014-04-27
  • 2016-03-08
相关资源
最近更新 更多