【发布时间】:2015-08-06 10:48:27
【问题描述】:
我碰巧注意到,在 C++ 中,使用 std rand() 方法调用的第一个随机数大部分时间都比第二个小得多。关于 Qt 实现,第一个几乎总是小几个数量级。
qsrand(QTime::currentTime().msec());
qDebug() << "qt1: " << qrand();
qDebug() << "qt2: " << qrand();
srand((unsigned int) time(0));
std::cout << "std1: " << rand() << std::endl;
std::cout << "std2: " << rand() << std::endl;
输出:
qt1: 7109361
qt2: 1375429742
std1: 871649082
std2: 1820164987
这是由于播种错误或错误导致的吗? 此外,虽然 qrand() 输出变化很大,但第一个 rand() 输出似乎随时间线性变化。只是想知道为什么。
【问题讨论】:
-
因为
rand()通常作为 LCG 实现,所以如果您在运行之间使用大小变化不大的种子(自 Epoch 以来的时间以秒为单位)为它播种,这是很正常的,播种后的第一个输出也将具有高度相关的量级。其他称为 escape from zeroland 的 PRNG 也存在类似问题,其中在将状态播种为 0 后的前几次迭代中,状态包含显着超过 50% 的 0。在许多情况下,解决方案是“预热” PRNG(或“逃离零地”):播种后,调用 PRNG 并丢弃它的前几个输出。 -
把它作为一个答案:)