gpt4 book ai didi

c++ - std::uniform_real_distribution 在失去随机性之前可以生成多少个随机数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:19 25 4
gpt4 key购买 nike

我正在为蒙特卡罗模拟编写 C++ 代码。因此,我需要生成许多均匀分布在 [0,1) 之间的数字。我包含了以下取自 here 的代码生成我的号码:

// 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;
}

所以每次我需要一个新号码时,我只需调用distribution(generator)。我运行我的蒙特卡洛模拟以获得许多样本结果。结果应该围绕真实平均值(未知)呈正态分布。当我运行卡方拟合优度检验以检查它们是否呈正态分布时,我的样本结果有时无法通过检验。这里的关键词是“有时”,所以这让我觉得我调用了太多次 distribution(generator),最后我失去了生成数字的随机性。我说的是每次模拟中生成的 10^11 个数字。

这可能吗?如果我在调用它之前使用 distribution.reset() 重置分配会怎样?这会解决我的问题吗?

感谢您提出任何建议。

最佳答案

如果随机数生成器有时没有通过测试,那么测试就太弱了。例如,如果一个测试有 99% 的置信度,那么一个完美的随机数生成器应该有大约 1% 的概率会失败。

例如,考虑一枚完全公平的硬币。如果翻转 1,000 次,平均会出现 500 次正面朝上。如果你想用它来测试随机性,你可以计算一个公平硬币在一定时间百分比内落入的值范围。然后确保您的随机数生成器不会比预期更频繁地失败测试。

您的测试方法——期望随机数生成器每次都能通过每个测试——只有在您的测试非常弱时才有效。这将使糟糕的随机数生成器过于频繁地通过,这不是一种好的测试方法。

真实故事:我实现的一个随机数生成器经过了 an independent testing lab 的严格测试.他们对其进行了 100 次测试,每次测试使用数百万个样本并测试各种特性。每个测试都有 99% 的置信度。 RNG通过了3次测试,均在预期范围内,因此通过了认证的测试部分。一个 RNG 在绝大多数时间都通过了这些极其严格的测试,这表明它是一个非常非常好的 RNG,也许是完美的。很难编写一个通过任何这些测试的损坏的 RNG。

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

关于c++ - std::uniform_real_distribution 在失去随机性之前可以生成多少个随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com