我必须使用 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/