C++随机引擎并非真正的随机

3

我正在尝试使用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左右,看起来更像正态分布,无论我使用哪个引擎。 我是否有什么理解错误? 谢谢, Guillaume


1
你为什么要使用 log10?这难道不会极大地影响分布的形状吗? - Chris Beck
2
根据您使用的生成器,您可能需要多次调用random_device才能正确地初始化所有内部状态。例如,std :: mt19937使用624字节的内部状态,因此您需要一个std :: seed_seq和多个输入来初始化其中的全部内容。请参见https://dev59.com/I2Up5IYBdhLWcg3wHUvi - Jesper Juhl
7
请参阅中心极限定理。你正在对一个随机数生成器的结果进行求平均。假设有足够多次独立重复的随机变量,每个变量都有确定的(有限)期望值和方差,那么这些数值的算术平均值将近似服从正态分布,而不管其背后的分布如何。你在300个独立的、随机分布的变量上计算平均值。 - jaggedSpire
1个回答

14

我注意到我的数值大致相同

这正是使用均匀分布随机数生成器时所期望的结果。在范围[10^(n-1),10^n)内的整数数量是范围[0,10^(n-1))内整数数量的9倍。


谢谢,是的,这完全有意义。 - Guillaume Guigue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接