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

C++ `srand()` function producing a pattern?

C++ 新手并遵循初学者教程here。请参阅标题为 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;
}

我正在用 time() 播种 srand()(用 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

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

我只能假设它由于种子 time() 而增加,它总是在增加。但这表明 rand() 函数并不是真正随机的,而是可预测的。

But that suggests the rand() function isn't truly random and is predictable.

是的,完全正确。通常,rand 是用一个非常简单的伪随机数生成器实现的。当需要真正随机或不可预测的数字时,使用 rand 是不合适的。

在幕后,您的实现可能使用 Linear congruential generator 并且您的三个示例都在同一线性区间内,至少对于第一个输出。