C++ Boost随机数生成问题

标签 c++ boost random seed

我必须使用 boost 库生成随机数,我使用以下代码:

boost::mt19937 gen;
boost::uniform_int<> dist(kUIMinManPort, kUIMaxManPort);
boost::variate_generator< boost::mt19937&, boost::uniform_int<> >
var(gen, dist);
unsigned int value = (unsigned int)var();
return boost::lexical_cast<std::string>(value);

显然我导入了所有必要的库。好吧,代码可以编译,但问题是我获得了相同的数字....

好的 好的...别担心,在谈论随机(或更好的伪随机)号码生成时,我不是新手。我知道我们必须提供一个种子,并且根据这个种子,将提供一系列伪随机数。

所以我的代码变成了这样:

boost::mt19937 gen(static_cast<unsigned int>(std::time(0)));
boost::uniform_int<> dist(kUIMinManPort, kUIMaxManPort);
boost::variate_generator< boost::mt19937&, boost::uniform_int<> >
var(gen, dist);
unsigned int value = (unsigned int)var();
return boost::lexical_cast<std::string>(value);

好吧,问题是每次我调用此函数(在 for 循环内)时,我们得到的数字几乎相同。 我怀疑提供给 boost 随机库的生成核心的时间依赖种子在 for 循环的时间段内没有变化,这就是为什么每次我运行一个循环并获得随机数时得到几乎相同的数字......问题是:如何有效地解决这个问题???我想给出了最佳实践...好吧,我不是唯一遇到这样问题的人:)

谢谢...

最佳答案

static boost::mt19937 gen(static_cast<unsigned int>(std::time(0)));

static 确保生成器只创建一次。问题是 time 的变化不够快。如果您在同一毫秒内调用您的函数,您将获得完全相同的结果。不幸的是,您的代码运行速度快到您在同一毫秒内调用它。

将生成器设为静态(或单例模式,或全局变量...)将解决问题。

关于C++ Boost随机数生成问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4329284/

相关文章:

c++ - 编译器在 Boost::ASIO 写入和 unistd 写入之间混合

c++ - 如何通过 boost 获得 0.5 增量的随机数?

c++ - 动态内存分配 C++

c++ - 为什么要捕获异常作为对常量的引用?

c++ - 3D滤镜方式如何在caffe中实现deconv层?

c++ - Boost 容器无法使用未定义(但已声明)的类进行编译

c++ - 具有不同大小的 boost::array 的不同实例是否会生成全新的类?

c++ - 编码接受来自未指定来源的随机位的密码算法

java - 随机数生成器在 Android 上生成相同的数字

java - 一致的跨平台 (java .Net) PseudoRandom 生成器,如果种子相同