大家再写程序的时候,有时会需要程序能产生一个随机数。那么rand()函数和srand()函数的组合使用,可以满足大家的需求。
注:建议先弄明白如何使用,然后再根据使用方法来理解。
一下是目录,大家自行跳转:
一、rand()函数和srand()函数的实现原理
二、rand()函数和srand()函数的使用方法
一、rand()函数和srand()函数的实现原理
1.1 源代码
使用这两个函数是需要添加<stdlib.h>的头文件,那么在该头文件内部该函数是什么样的呢
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int rand(void)
{
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void srand(unsigned int seed)
{
next = seed;
}
1.2 了解函数执行流程
一般我们这样使用这两个函数:
srand((unsigned)time(NULL);
int num=rand()%100;
实现功能:给num赋值一个[0,99]的随机值;
大家要注意两个关键点:
1、%:取余运算赋的用法:
这里我们定义一下表达式(方便表达):num=rand()%100 => 值(num) = 被取余数( rand() ) % 取余数(100)
当 被取余数的值 > 取余数时,就可以得到一个 [ 0 , 取余数值 ] 的值
例子:100%13 => 余下的值肯定是不能整除13,不会等于13,并且小于13的!
总:这就使得我们可以通过%来控制我们想要的数值的大小。
2、time(NULL)
time()其实也是一个函数,time_t time(time_t *t)使用它需要包含头文件<time.h>
函数作用:返回一个值,即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒。
参数:time(NULL)或time(0)
3、next = next * 1103515245 + 12345;
这段代码的目的就是为了拉大随机值之间的差距,如果不对next进行计算,那么每次产生的随机值就是随时间的流逝而递增,每过一秒加一。
示范一下:
如果不对next的值拉大差距,那么每次生成的随机数就会间距非常小,达不到随机的要求
二、rand()函数和srand()函数的使用方法
主要讲一个公式,非常好用=>产生一个[ m,n ]之间的随机值
0<=rand()%(n-m+1)<=n-m
m<=rand()%(n-m+1)+m<=n