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 并且您的三个示例都在同一线性区间内,至少对于第一个输出。
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 并且您的三个示例都在同一线性区间内,至少对于第一个输出。