在C语言中生成某个范围的随机数,需要用到的是rand,srand,time这几个函数。
1.关于rand函数
头文件
<stdlib>
使用声明
给ret了一个从0到RAND_MAX的数
int ret=rand()
使用说明
rand函数会返回一个范围在 0 到 RAND_MAX 之间的伪随机数,RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。
注意
仅仅使用rand函数不能实现生成随机数的功能
int ret = rand();
printf("%d", ret);
当我们打印出ret的值时,会发现结果如下
无论程序运行多少次结果都是41
只使用rand函数似乎不能每次运行程序都生成一个随机数
于是,我们便需要使用srand和rand一起搭配使用
2.关于srand函数
头文件
<stdlib>
使用声明
void srand(unsigned int seed)
可以看出srand不返回任何值,且srand需要输入的是一个unsigned int 类型的数值
使用说明
srand会设置一个rand生成的随机数的起点
也就是说只有srand中的输入值是一个随机数,rand才能做到每次程序运行的时候生成的都是不同的随机数
看起来似乎矛盾了
我们想要生成一个随机数,去需要输入一个随机数
怎么办?
什么东西一直在变?
没错,就是时间
我们便需要用到时间戳
什么是时间戳?
时间戳
一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。
通俗点说就是表示某一刻的时间
在网上有很多时间戳转换工具,很多在线工具
打开后界面如下
可以更直观的发现:时间戳与时间之间可以相互转换
而时间每时每刻都在变化,时间戳也在不断变化,正满足了srand函数输入随机数的需要
在C语言中我们如何去调用时间戳呢?
便要用到time函数
3.关于time函数
头文件
<time.h>
使用声明
time_t time(time_t *seconds)
可见time函数返回的是一个time_t类型的值,需要输入的是一个指针
这个函数原理比较复杂
对于只想调用时间戳的我们,暂时不需要了解
当我们使用的时候,给予一个NULL即可
#include<time.h>
time(NULL)
了解了这三个三个函数之后
我们便可以生成随机数了
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
srand((unsigned int)time(NULL));
int ret=rand();
printf("%d",ret);
return 0;
}
程序每次运行的时候便能生成不同的随机数
注意
srand((unsigned int)time(NULL));
这条语句必须在程序的最开始便设定
且由于时间的特殊性,如果两次运行程序的时间小于1秒,会导致生成的随机数相同
关于生成某一范围的随机数
我们现在已经能生成一个随机数了,但是如何规定一个随机数的范围呢?
我们可以用到取模的运算法则
不管A和B取什么值,A%b的结果都会是不大于B的一个数
所以
若我们想在0-100生成随机数
只需要在上面的代码稍作修改即可
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
srand((unsigned int)time(NULL));
int ret=rand()%101;
printf("%d",ret);
return 0;
}
如此便可以生成一个0-100的随机数
若想生成1-101呢?
在取模后加一即可
如此,便在C语言中成功生成某个范围的随机数