rand函数和srand函数的用法和区别

srand初始化随机种子,rand产生随机数

rand(产生随机数)

表头文件: #include<stdlib.h>           //标准库 <cstdlib> (被包含于<iostream>中)

定义函数 :int rand(void)

函数说明 :

因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。

返回值:

返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。

0~RAND_MAX每个数字被选中的机率是相同的。


    可以认为rand()在每次被调用的时候,它会查看: 
    1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用 
srand(seed)一次来初始化它的起始值。 
    2)如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。 

    根据上面的第一点我们可以得出: 
    1)如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间)。 
    2) 否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed, RAND_MAX(0x7fff))之间的一个随机取得的值。 
    3)如果在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。


    举几个例子,假设我们要取得0~6之间的随机整数(不含6本身): 

例一,不指定seed: 
for(int   i=0;i<10;i++){
ran_num=rand()   %  6; 
cout < <ran_num << "  "; 

每次运行都将输出:5   5   4   5   0   0  

例二,指定seed为定值1: 
srand(1); 
for(int   i=0;i<10;i++){
ran_num=rand()   %  6; 
cout < <ran_num << "  "; 

每次运行都将输出:5   5   4   5   0   0  
跟例子一的结果完全一样。 

例三,指定seed为定值6: 
srand(6); 
for(int   i=0;i<10;i++){
ran_num=rand()   %  6; 
cout < <ran_num << "  "; 

每次运行都将输出:4   1   1   4   4   4  
随机值也是在[0,6)之间,随得的值跟srand(1)不同,但是每次运行的结果都相同。 

例四,指定seed为当前系统流逝了的时间(单位为秒):time_t  time(0): 
#include  <ctime> 
//… 
srand((unsigned)time(0)); 
for(int   i=0;i<10;i++){
ran_num=rand()   %  6; 
cout < <ran_num << "  "; 

第一次运行时输出:0   1   4   5   2   3  
第二次:3   2   3  0   3   5   2   2  
总之,每次运行结果将不一样,因为每次启动程序的时刻都不同(间隔须大于1秒?见下)。 


用rand()   /  double(RAND_MAX)可以取得0~1之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例: 
double  ran_numf=0.0; 
srand((unsigned)time(0)); 
for(int   i=0;i<10;i++){
ran_numf   =   rand()  /  (double)(RAND_MAX); 
cout < <ran_numf << "  "; 

运行结果为:0.716636,0.457725,…等10个0~1之间的浮点数,每次结果都不同。 

如果想取更大范围的随机浮点数,比如1~10,可以将 
rand()   /(double)(RAND_MAX)   改为  rand()  /(double)(RAND_MAX/10) 
运行结果为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。 
至于100,1000的情况,如此类推。


总结:

我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a) 功能是

初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过sand()函数,我们是可以产生可以预见的随机序列,

那我们如何才能产生不可预见的随机序列呢?我们可能常常需要这样的随机序列,是吧。利用srand((unsign)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的,对了,你知道time() 函数的功能是返回从1970/01/01到现在的秒数的吧,可能这个起始时间不正确,你查一下对不对吧,C还提供了另一个更方便的函数,randomize()

原形是void randomize(),功能是用来始初rand() 的种子的初始值,而且该值是不确定的,它相当于srand((unsign)(time(NULL)) 不过应注意的是randomize()的功能要通过time来实现所以在调用它时头文件要包含time.h罢了


  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值