C++实现高斯随机数生成器每次运行输出相同序列问题求助
问题成因
- 你调用的
srand((unsigned int)time(NULL))是C标准库rand()函数的种子设置接口,和C++<random>库中的std::default_random_engine完全独立,没有任何关联,无法为C++的随机引擎设置种子。 - 你的
std::default_random_engine实例每次启动程序时都会使用默认的固定初始值作为种子,因此每次运行生成的随机序列完全相同。 - 主函数中重复调用
srand属于冗余操作,没有任何作用。
修复方案
修改Gaussian类的构造逻辑,为std::default_random_engine设置随机种子,同时删除冗余的srand调用即可。推荐使用std::random_device获取真随机种子,修复后代码如下:
#include <cstdio> #include <random> #include <ctime> class Gaussian { std::default_random_engine gen; public: Gaussian() { std::random_device rd; gen.seed(rd()); } double get(double mean, double std) { std::normal_distribution<double> nd(mean, std); return nd(gen); } };
主函数修改为:
int main(int argc, char**argv) { Gaussian g; int N = 10; double mean = 50.0; double std = 2.0; for (int i = 0; i < N; i++) { double value = g.get(mean, std); printf("%f\n", value); } } // 编译命令:g++ main.cpp
如果你的运行环境中std::random_device实现存在兼容性问题,也可以退而求其次使用时间作为种子,将构造函数中的种子设置逻辑替换为gen.seed((unsigned int)time(NULL));即可,注意该方案如果程序在1秒内多次运行,会因为时间戳相同生成相同的随机序列。
内容的提问来源于stack exchange,提问作者stackoverflowuser2010
相关产品推荐
相关产品推荐

