【发布时间】:2015-05-28 19:21:39
【问题描述】:
我正在为蒙特卡洛模拟编写 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() 重置分布怎么办?这能解决我的问题吗?
感谢您提出的任何建议。
【问题讨论】:
-
您可以为 rng 设置种子值
-
default_random_engine使用的 Mersenne Twister 算法有一个period of 2^19937 - 1。 10^11 甚至不应该让它流汗。 -
@MarkRansom
default_random_engine使用的算法是实现定义的。 -
那么,有疑问,使用 mt19937?
-
分布没有随机性,生成器有随机性。这一切都取决于发电机。 @zneak 有正确的想法。