1.rand函数
需要引用头文件<stdlib.h>
(1)用法:
int main() {
int a = rand();
int b = rand();
printf("%d\n%d", a,b);
return 0;
}
(2)缺点:随机数执行一次后不再改变(上述代码再执行一次结果仍然为41和18467)
(3)原理:通过rand产生的随机数为伪随机数,此随机数是根据某个数值按照一个正态分布的公式推得。
其中x轴代表某个数值,我们称之为“种子”;y轴代表随机数。
种子在每次启动计算机时是随机的,但计算机启动后不再发生变化,所以我们再次运行上述代码,随机数不会改变。这时我们要用到srand函数来改变种子,以达到改变随机数的目的。
2.srand函数
用法:srand需要一个大于等于0的整数作为参数即srand(unsigned int)
int main() {
srand(2);
int a = rand();
int b = rand();
printf("%d\n%d", a,b);
return 0;
}
int main() {
srand(3);
int a = rand();
int b = rand();
printf("%d\n%d", a,b);
return 0;
}
可见改变srand的参数即可改变随机数。我们可以用time函数来改变srand的参数。
3.time函数
需要引用头文件<time.h>
用法:time(0)或time(NULL)将返回一个值,即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒。
把三个函数结合,得到最终生成随机数函数。
int main() {
srand((unsigned)time(NULL));
int a = rand();
int b = rand();
printf("%d\n%d", a,b);
return 0;
}
4.实例
请生成[13,65]之间的随机数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main() {
srand((unsigned)time(0));
int a = rand()%53+13;
//模53代表生成[0,52]之间的随机数,+13代表生成[13,65]之间的随机数。
printf("%d", a);
return 0;
}
5.注意事项
如果要用循环语句大量生成随机数,srand一定要放在循环语句之外,rand放在循环语句之内!
原因:假如我们需要循环5次,生成五个随机数,电脑执行这5次的速度非常快,通常以毫秒来计,而time(NULL)函数以秒来计,过1秒加1。所以在这短暂的五次循环过程中,我们可以把srand((unsigned)time(NULL))这个函数看作srand(3) 【任意 unsigned常数都行,这里拿3举例】
<1>如果把srand(3)写在循环外
int main() {
srand(3);
for (int i = 0;i < 5;i++) {
int k = rand();
printf("%d\n", k);
}
return 0;
}
可生成5个随机数
<2>如果把srand(3)写在循环内
int main() {
for (int i = 0;i < 5;i++) {
srand(3);
int k = rand();
printf("%d\n", k);
}
return 0;
}
生成的全是<1>中的第一个数,即srand每次被重设为一次3,都会从第一个随机数开始读取,所以不能把srand放循环内。
从以上探究可以发现一个种子可对应多个随机数,但种子一旦定了,这些随机数的值和读取顺序也定了。