0

我必须使用 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循环的时间段内没有变化,这就是为什么每次我运行一个循环并获得一个随机数时都会得到几乎相同的数字......问题是:如何有效地解决这个问题???我想给出了一个最佳实践......好吧,我不是唯一一个遇到这样问题的人:)

谢谢...

4

1 回答 1

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

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

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

于 2010-12-01T21:26:27.173 回答