在注意到 rand() 函数每次产生相同的 41 输出后,我使用 srand(time(0)) 为生成器设置种子。这解决了重复输出的问题,但现在它给了我不断增加的数字。 (即 245、248、250、253、255、256)。我可以理解它是受系统时间的影响而增加的,但这正常吗?

这是我的程序:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{

    int number;

    srand(time(0));

    cout << rand() % 1000;

    return 0;

}

我反复运行它而不是循环。
多次试验的输出:
285
295
305
311
325
334
344
354
355

最佳答案

MS 的 C++ rand() 使用最简单的随机生成器 Linear congruential generator

这是它的代码:

int __cdecl rand (
    void
    )
{
    _ptiddata ptd = _getptd();

    return( ((ptd->_holdrand = ptd->_holdrand * 214013L
        + 2531011L) >> 16) & 0x7fff );
}

因此,无论何时您为函数设置种子,您只需设置第一个值(如果您快速运行程序,它显然会不时增加一些单位)

现在,如果您将 rand() 的数学方程插入一个值 x+a ,其中 x 是您上次调用函数的值,而 a 是自该调用以来您的时间变化,您会注意到:
((x+a) * 214013 + 2531011) >> 16 = (x*214013+2531011 + a*214013) >> 16

因为你的程序运行得非常快。假设您的 a05 sec 之间变化。然后你的 a*214013 现在有一个 1070065 的最大值,当你把这个数字右移 16 位时,你最终得到十进制的 16,这是 大约 你的新输出与你之前的输出有多少不同(我说大约是因为你不能说 (x*214013+2531011 + a*214013) >> 16 = (x*214013+2531011 >> 16) + (a*214013 >> 16) 因为进位)

关于C++ 可预测的 Rand() 输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17385541/

10-11 22:54