C++`srand()`函数产生一个模式?

the*_*may -1 c++ random srand

新的C++和下面的初学者的教程在这里.请参阅标题为C++中的随机数的部分.准确使用给出的代码:

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main () {
   int i,j;

   // set the seed
   srand( (unsigned)time( NULL ) );

   /* generate 10  random numbers. */
   for( i = 0; i < 10; i++ ) {
      // generate actual random number
      j = rand();
      cout <<" Random Number : " << j << endl;
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我播种srand()time()(编译g++)等所产生的结果应该是完全随机的.但是,这是我得到的结果:

$ ./a.out
 Random Number : 1028986599
 Random Number : 491960102
 Random Number : 561393364
 Random Number : 1442607477
 Random Number : 813491309
 Random Number : 1467533561
 Random Number : 986873932
 Random Number : 1373969343
 Random Number : 411091610
 Random Number : 761796871
$ ./a.out
 Random Number : 1029003406
 Random Number : 774435351
 Random Number : 36559790
 Random Number : 280067488
 Random Number : 1957600239
 Random Number : 1937744833
 Random Number : 1087901476
 Random Number : 684336574
 Random Number : 1869869533
 Random Number : 621550933
$ ./a.out
 Random Number : 1029020213
 Random Number : 1056910600
 Random Number : 1659209863
 Random Number : 1265011146
 Random Number : 954225522
 Random Number : 260472458
 Random Number : 1188929020
 Random Number : 2142187452
 Random Number : 1181163809
 Random Number : 481304995
Run Code Online (Sandbox Code Playgroud)

从每次./a.out执行时生成的第一个数字可以看出,10循环中的第一个数字在每次执行时都在增加.它似乎总是大约1.02百万.进一步的测试表明这种模式总是存在,并不是巧合.

我只能假设它由于种子time()而增加,种子总是在增加.但这表明该rand()功能并非真正随机且可预测.

Dav*_*rtz 5

但这表明rand()函数并非真正随机且可预测.

是的,这是绝对正确的.通常,rand使用非常简单的伪随机数生成器来实现.rand当需要真正随机或不可预测的数字时,使用不合适.

在引擎盖下,您的实现可能使用线性同余生成器,并且您的三个示例都在相同的线性间隔内,至少对于第一个输出.

  • @thestateofmay该教程具有误导性.如果你不调用`srand`,你每次都会得到相同的序列.如果你调用`srand`,你将每次从不同的点开始序列,但这意味着什么取决于你的平台的'rand`实现. (3认同)