c 语言的stdlib.h 库提供了⼀个函数叫rand, rand 会返回一个伪随机数,范围在0-rand_max之间。
rand_max的大小是依赖编译器实现的,大多数编译器是32767
这里我们先用代码运行两次来看一下随机数的生成
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
运行结果1
运行结果2
这里我们发现,虽然它第一次确实生成了4个看似随机的数,但是和第二次运行结果比起来,这不就是一模一样的四个数吗。为什么?
原因是rand返回的是一个伪随机数,它是通过特定的算法来实现的,而算法又是根据一个叫做种子的基准值来进行运算的。默认情况下随机数种子是1
简单的来说,随机数的生成取决于种子的基准值。
c语言又提供了一个函数叫srand用于初始化随机数的生成器
srand 函数原型
void srand (unsigned int seed);
通过srand 函数的seed参数来设置随机数种子,如果我们想要一个随时都在变化的伪随机数,那么seed参数就必须得一直变化。什么是一直变化的呢?答案就是时间time
c语言的
time.h
库中有⼀个函数叫time
,可以获得时间
time 函数
原型
time_t time (time_t* timer);
time会返回当前日历时间,其实也不算时间它是1970年1⽉1⽇0时0分0秒到现在时间之间的
差值,单位是秒。
time 函数
里的timer参数如果是NULL那么就会返回这个时间差也叫时间戳。
接下来我们把以上知识整合一下写出以下代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand((unsigned int)time(NULL)); //time(NULL)返回时间戳
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
我们运行3次
第一次运行
第二次运行
第三次运行
可以看到现在我们的随机数是会一直变化了,到这里我们的随机数就完成了。
如果我们要生成 0-99 的范围
rand() %100; //余数范围是0-99
如果我们要生成 1- 100 的范围
rand()%100+1; // 余数范围 0-99 加上1,就成了1-100
如果要生成 100-200的范围
100 + rand()%(200-100+1)//余数的范围是0~100加100后就是100~200
如果要生成a-b的范围
a + rand()%(b-a+1)
注:srand((unsigned int)time(NULL));在一次运行程序中调用一次就够了