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次35678910
srand(0)3877192123824378855117978365322851045030612
srand(1)4118467633426500191691572411478293582696224464
srand(2)45292162419817795294841965014590264311070518316
srand(3)4871969294909170312357717702235032721712168
srand(4)51179452715938617345275042081520576109606020
srand(5)54286931225524449276603143023927176492747232640
srand(6)58667330119157455206258927040147221121626492
srand(7)611742215215704015521651630152117942772720344
srand(8)642817031131103258351044349788671147114195
srand(9)686151181752239833821436936095940279828047
srand(10)7116899327213694136971829667223012117261899
srand(11)742764821136498924011222239834852823828519
srand(12)77562862322905215582615012947299261198122371
srand(13)81163762409620348118723007616059269992849316223
srand(14)842712591921164322187123519171240711223610075
srand(15)8751052705629383250151622228421144287483927
srand(16)9015854121532700210048908925396182171249130547
srand(17)94266023001718297203631301528509152902900324399
srand(18)974582151139592306771694231621123621274718251
srand(19)10015331209888822420869196694352925812103

所以最终可以得出结论,在同一个机器中(不同机器没试验过),每个随机数种子对应的随机数系列是固定的,所以如果想要保证不同的时候运行程序产生不一样的随机数,必须使随机数种子是随机的,种子的随机才能决定决定随机数是否是随机的。

所以最好使用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,

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

  • 29
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值