在注意到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
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