在注意到 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
因为你的程序运行得非常快。假设您的
a
在 0
和 5
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/