C++可预测的Rand()输出

Rob*_* Lu 3 c++ random

在注意到rand()函数每次产生41的相同输出后,我使用srand(time(0))播种了生成器.这解决了重复输出的问题,但现在它给了我不断增加的数字.(IE 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;

}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*sie 5

rand()MS的C++ 使用最简单的随机生成器线性同余生成器

这是它的代码:

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

    return( ((ptd->_holdrand = ptd->_holdrand * 214013L
        + 2531011L) >> 16) & 0x7fff );
}
Run Code Online (Sandbox Code Playgroud)

因此,每当你为你的函数设定种子时,你只需设置第一个值(如果你快速运行你的程序,它会不时地增加一些单位)

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

因为你运行你的程序非常快.你可以说,你和a之间的差异.那么当你将这个数字右移16位时,你的最大值是十进制,这大约相当于你的新输出与前一个输出的差异(我说大约是因为你不能这么说(x*) 214013 + 2531011 + a*214013)>> 16 =(x*214013 + 2531011 >> 16)+(a*214013 >> 16)因为携带)05a*214013107006516