C++生成随机数

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,

使用时间当做随机数种子,每次产生的随机数系列都不一样。

你可能感兴趣的:(C++)