【发布时间】:2015-11-26 03:39:11
【问题描述】:
我相信随机数生成器 (RNG) 应该只播种一次,以确保结果的分布符合预期。
我正在用 C++ 编写一个蒙特卡罗模拟,它由一个主函数(“A”)多次调用另一个函数(“B”)组成,其中在 B 中生成了大量随机数。
目前,我在 B 中执行以下操作:
void B(){
std::array<int, std::mt19937::state_size> seed_data;
std::random_device r;
std::generate(seed_data.begin(), seed_data.end(), std::ref(r));
std::seed_seq seq(std::begin(seed_data), std::end(seed_data)); //perform warmup
std::mt19937 eng(seq);
std::uniform_real_distribution<> randU(0,1);
double myRandNum = randU(eng);
//do stuff with my random number
}
如您所见,每次调用函数 B 时,我都会创建一个新的随机数生成器。据我所知,这是浪费时间 - RNG 仍然可以生成更多的随机数!
我已经尝试过制作“eng”extern,但这会在使用 g++ 时产生错误:
错误:“eng”同时具有“extern”和初始化程序 extern std::mt19937 eng(seq);
我怎样才能使随机数生成器“全局”,以便我可以多次使用它?
【问题讨论】:
-
为什么不将所有需要的 RNG 对象放在一个结构中,并通过引用将其传递到任何你想要的地方?
标签: c++ random global-variables global