前言
在写代码的过程中我们经常会用到随机数之类的数据,那在c语言中有煤油生成随机数的方法呢?一定有,就是 rand 函数。
rand 函数
C语⾔提供了⼀个函数叫rand,这函数是可以⽣成随机数的,函数原型如下所⽰:
int rand (void);
关于rand函数的具体解释请转到rand函数
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是
依赖编译器上实现的,但是⼤部分编译器上是32767。
rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h
我们用一段代码来测试一下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
测试结果:
第一次结果:
第二次结果:
我们发现这两次运行结果竟然相同,这时候我们就有疑惑了?不是随机数吗?为什么两次运行结果生成的数会相同呢?这就与rand生成随机数的原理有关了。rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。而rand函数使用的种子默认为1。如果要⽣成不同的随机数,就要让种⼦是变化的。
srand 函数
C语⾔中⼜提供了⼀个函数叫srand,⽤来初始化随机数的⽣成器的,srand的原型如下:
void srand (unsigned int seed);
程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随
机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
时间戳
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。
在C语⾔中有⼀个函数叫time,就可以获得这个时间,time函数原型如下:
time_t time (time_t* timer);
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的
差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类
型。
time函数的参数timer如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存
中带回去。
如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
如果只是让time函数返回时间戳,我们就可以这样写:
time(NULL);//调⽤ time 函数返回时间戳,这⾥没有接收返回值
那我们就可以让⽣成随机数的代码改写成如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//使⽤ time 函数的返回值设置种⼦
//因为 srand 的参数是 unsigned int 类型,我们将 time 函数的返回值强制类型转换
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
第一次运行:
第二次运行:
第三次运行:
我们发现这几次生成的数字就不一样了。
srand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了。
设定随机值范围
如果我们要⽣成0~99之间的随机数,⽅法如下:
rand() %100;//余数的范围是0~99
如果要⽣成1~100之间的随机数,⽅法如下:
rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100
如果要⽣成100~200的随机数,⽅法如下:
100 + rand()%(200-100+1)
//余数的范围是0~100,加100后就是100~200
通过上面这些例子我们可以总结出控制随机数范围的表达式:
//如果要生成a~b的随机数
a + rand()%(b-a+1)
结语
以上就是c语言中随机数的生成方法,希望对大家有所帮助,感谢阅读!!!