1.rand函数

需要引用头文件<stdlib.h>

(1)用法:

int main() {
	int a = rand();
	int b = rand();
	printf("%d\n%d", a,b);
	return 0;
}

C语言生成随机数_rand函数

(2)缺点:随机数执行一次后不再改变(上述代码再执行一次结果仍然为41和18467

(3)原理:通过rand产生的随机数为伪随机数,此随机数是根据某个数值按照一个正态分布的公式推得。

C语言生成随机数_time函数_02

其中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;
}

C语言生成随机数_rand函数_03

int main() {
	srand(3);
	int a = rand();
	int b = rand();
	printf("%d\n%d", a,b);
	return 0;
}

C语言生成随机数_srand函数_04


可见改变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;
}

C语言生成随机数_srand函数_05

可生成5个随机数

<2>如果把srand(3)写在循环内

int main() {
	for (int i = 0;i < 5;i++) {
		srand(3);
		int k = rand();
		printf("%d\n", k);
	}
	return 0;
}

C语言生成随机数_随机数_06

生成的全是<1>中的第一个数,即srand每次被重设为一次3,都会从第一个随机数开始读取,所以不能把srand放循环内。

从以上探究可以发现一个种子可对应多个随机数,但种子一旦定了,这些随机数的值和读取顺序也定了。