在失去随机性之前,std :: uniform_real_distribution会产生多少个随机数?

GDD*_*GDD 2 c++ random

我正在为蒙特卡罗模拟编写c ++代码.因此,我需要生成在[0,1]之间均匀分布的许多数字.我从这里收集了以下代码来生成我的数字:

// uniform_real_distribution
#include <iostream>
#include <random>

std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0.0,1.0);

int main()
{  
    double number = distribution(generator); //rnd number uniformly distributed between [0,1)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以每次我需要一个新号码时,我都会打电话distribution(generator).我运行蒙特卡罗模拟以获得许多样本结果.结果应该正常分布在真实均值周围(未知).当我运行卡方拟合优度检验以检查它们是否正常分布时,我的样本结果有时无法通过测试.这里的关键词是"有时",所以这让我觉得我打了distribution(generator)太多次,最后我失去了生成数字的随机性.我在谈论每个模拟中生成的10 ^ 11个数字.

有可能吗?如果我distribution.reset()在调用之前重置分发怎么办?这会解决我的问题吗?

感谢您的任何建议.

Dav*_*rtz 6

如果随机数生成器有时没有通过测试,则测试太弱.例如,如果测试具有99%的置信度,则应该预期完美随机数生成器在大约1%的时间内失败.

例如,考虑一个完全公平的硬币.如果你翻转1000次,平均可以获得500个头.如果您想将此作为随机性的测试,您可以计算公平硬币在某个百分比内落入的值的范围.然后确保您的随机数生成器不会比预期更频繁地使测试失败.

您的测试方法 - 期望随机数生成器每次都通过每个测试 - 只有在您的测试非常弱的情况下才有效.这将允许差的随机数生成器过于频繁地进行,并且不是一种好的测试方法.

真实故事:我实施的随机数发生器经过独立测试实验室的严格测试.他们进行了100次测试,每次测试使用数百万个样品并测试各种性能.每项测试的置信度均为99%.RNG未通过3次测试,这是在预期的范围内,因此通过了认证的测试部分.RNG通过这些极其严格的测试,绝大多数时间都证明它是一个非常非常好的RNG,也许是完美的.编写破坏的RNG很难通过任何这些测试.

您需要计算完美RNG未通过测试的概率,然后查看您的RNG是否显示接近预期的失败率.