C语言中随机值的生成方法

前言

在写代码的过程中我们经常会用到随机数之类的数据,那在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语言中随机数的生成方法,希望对大家有所帮助,感谢阅读!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值