C++中没有类似random()的函数,要想每次程序运行时产生不同的随机数,必须srand(unsignd int seed) 和 rand()方法一起使用。
如果只是用rand(),则程序每次运行产生的随机数序列都是一样的。rand()可以产生一个随机数值,范围是0到RAND_MAX,RAND_MAX在stdlib.h中定义,值是0x7fff。
stdlib.h关于随机函数的声明
// Maximum value that can be returned by the rand function:
#define RAND_MAX 0x7fff
_ACRTIMP void __cdecl srand(_In_ unsigned int _Seed);
_Check_return_ _ACRTIMP int __cdecl rand(void);
即使使用了srand生成随机数种子,如果给的种子相同,产生的随机数序列也是一样的。所以一定要在每次运行程序调用srand(unsigned int seed)产生随机数种子的时候,传入不一样的seed。最好使用time(0)或者getpyid()。
一、只使用rand(),每次程序运行产生的随机数序列都是一样的
void main(){
//3.34
for (int i = 0; i < 10; i++)
cout << rand() << ",";
cout << endl;
system("pause");
}
第1次执行的输出:
41,18467,6334,26500,19169,15724,11478,29358,26962,24464,
第2次执行的输出:
41,18467,6334,26500,19169,15724,11478,29358,26962,24464,
重复执行执行多次,可以发现执行结果都是一样的。
二、同时使用srand()和rand()
按照惯常的思维,使用了随机数种子,那么每次生成的随机数就是不一样的,实则不然。
void main(){
//3.34
for (int i = 0; i < 10; i++) {
srand(i);
cout << rand() <<",";
}
system("pause");
}
第一次执行的结果:
38,41,45,48,51,54,58,61,64,68,
第二次执行的结果:
38,41,45,48,51,54,58,61,64,68,
尴尬了。。。怎么还是一样的。
从表面看可以得出结论,并不是给了种子,产生的随机数序列就是不一样的,关键还是要给不一样的种子。
可以这么理解,每个随机数种子(srand())对应一系列的随机数(rand()),如果种子相同,则这个随机数系列就是一样的。
比如:
给定种子srand(1) ,则此时使用rand()产生的系列就是
41,18467,6334,26500,19169,15724,11478,29358,26962,24464,
可以看出,跟只使用rand()取随机数时是一样的,说明只使用rand方法时,默认的随机数种子就是srand(1)。
种子 | 第1次调用rand() | 第2次 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|---|
srand(0) | 38 | 7719 | 21238 | 2437 | 8855 | 11797 | 8365 | 32285 | 10450 | 30612 |
srand(1) | 41 | 18467 | 6334 | 26500 | 19169 | 15724 | 11478 | 29358 | 26962 | 24464 |
srand(2) | 45 | 29216 | 24198 | 17795 | 29484 | 19650 | 14590 | 26431 | 10705 | 18316 |
srand(3) | 48 | 7196 | 9294 | 9091 | 7031 | 23577 | 17702 | 23503 | 27217 | 12168 |
srand(4) | 51 | 17945 | 27159 | 386 | 17345 | 27504 | 20815 | 20576 | 10960 | 6020 |
srand(5) | 54 | 28693 | 12255 | 24449 | 27660 | 31430 | 23927 | 17649 | 27472 | 32640 |
srand(6) | 58 | 6673 | 30119 | 15745 | 5206 | 2589 | 27040 | 14722 | 11216 | 26492 |
srand(7) | 61 | 17422 | 15215 | 7040 | 15521 | 6516 | 30152 | 11794 | 27727 | 20344 |
srand(8) | 64 | 28170 | 311 | 31103 | 25835 | 10443 | 497 | 8867 | 11471 | 14195 |
srand(9) | 68 | 6151 | 18175 | 22398 | 3382 | 14369 | 3609 | 5940 | 27982 | 8047 |
srand(10) | 71 | 16899 | 3272 | 13694 | 13697 | 18296 | 6722 | 3012 | 11726 | 1899 |
srand(11) | 74 | 27648 | 21136 | 4989 | 24011 | 22223 | 9834 | 85 | 28238 | 28519 |
srand(12) | 77 | 5628 | 6232 | 29052 | 1558 | 26150 | 12947 | 29926 | 11981 | 22371 |
srand(13) | 81 | 16376 | 24096 | 20348 | 11872 | 30076 | 16059 | 26999 | 28493 | 16223 |
srand(14) | 84 | 27125 | 9192 | 11643 | 22187 | 1235 | 19171 | 24071 | 12236 | 10075 |
srand(15) | 87 | 5105 | 27056 | 2938 | 32501 | 5162 | 22284 | 21144 | 28748 | 3927 |
srand(16) | 90 | 15854 | 12153 | 27002 | 10048 | 9089 | 25396 | 18217 | 12491 | 30547 |
srand(17) | 94 | 26602 | 30017 | 18297 | 20363 | 13015 | 28509 | 15290 | 29003 | 24399 |
srand(18) | 97 | 4582 | 15113 | 9592 | 30677 | 16942 | 31621 | 12362 | 12747 | 18251 |
srand(19) | 100 | 15331 | 209 | 888 | 8224 | 20869 | 1966 | 9435 | 29258 | 12103 |
所以最终可以得出结论,在同一个机器中(不同机器没试验过),每个随机数种子对应的随机数系列是固定的,所以如果想要保证不同的时候运行程序产生不一样的随机数,必须使随机数种子是随机的,种子的随机才能决定决定随机数是否是随机的。
所以最好使用time(0)当做seed种子,让种子随着时间变化,就能保证随机数随着时间变化。
void main(){
//3.34
srand(time(0));
for (int i = 0; i < 10; i++) {
cout << rand() <<",";
}
system("pause");
第一次运行:
24133,18986,27006,27947,23838,31877,28668,578,8291,13913,
第2次运行:
24228,3010,20779,4887,28048,14680,20625,13991,28375,32227,
第3次运行:
24326,30550,32416,5890,9806,1410,15695,24476,32203,11625,
使用时间当做随机数种子,每次产生的随机数系列都不一样。