【发布时间】:2011-05-18 18:35:56
【问题描述】:
我必须使用 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循环的时间段内没有变化,这就是为什么每次我运行一个循环并获得一个随机数时得到几乎相同的数字......问题是:如何有效地解决这个问题???我想给出了一个最佳实践......好吧,我不是唯一一个遇到这样问题的人:)
谢谢...
【问题讨论】:
-
经过一些经验,我会说不要使用 boost::random 例如。产生正常的偏差,但我从来没有遇到过他们的 mersenne twister 的任何问题。
-
啊,使用 time(0) 作为种子意味着您不会在一秒钟内多次运行程序。我通常在 unix 上使用
time(0) + (long long)getpid() << 32之类的东西。 Windows 上有一个等价物。 -
boost::random_device(在 C++0x 中又称为std::random_device)是比std::time()更好的种子来源。但仍不应在循环的每次迭代中调用它。