文章目录
- 前言
- 一、生成随机数
- rand() 函数
- srand()函数
- time()函数
- 生成一个真正的随机数
- 二、使用小技巧
- 三、使用代码实例(简易抽卡)
- 总结
前言
本文将详细解释如何在C语言中生成随机数,并介绍应用的小技巧
一、生成随机数
c语言生成一个真正的随机数需要用到三个函数:rand()、srand()和time()。
函数介绍
rand() 函数
头文件:#include<stdlib.h>
函数声明:int rand(void)
作用;生成一个伪随机数序列,随机数取值范围是0~RAND_MAX
PS - RAND_MAX其实是一个宏名,在头文件<stdlib.h>中存在宏定义
#define RAND_MAX 32767
不同的编译器会将它定义为不同的数值,本文使用的编译器讲它定义成了32767
函数逻辑:函数声明中函数调用符号()中是void,所以不需要参数,函数rand()就会返回一个伪随机数 rand()函数和srand()函数一定是配合使用的,rand()函数只靠自己生成不了随机数,必须要在srand()函数中设置种子(起点)rand()函数才会返回随机数。rand()函数调用前会检查是否定义了srand(),如果没有定义将自动生成srand(1)并且调用它
srand()函数
头文件:#include<stdlib.h>
函数声明:void srand (unsigned int seed);
作用:配合rand()函数一起使用才有意义,只有对srand()函数进行如srand(1)、srand(2),这样的设置种子,rand()才会返回伪随机数序列
rand()函数和srand()函数必须放在一起使用,srand()函数是种下的种子,rand()函数是它结出的果子,没有种子(srand)就没有果子(rand)
函数逻辑:srand():伪随机数生成器。函数声明的函数调用符()中为unsigned int seed(seed中文翻译为种子),所以我们需要传人一个无符号整数作为seed(种子),才能生成随机数序列。但每一个种子如srand(1),生成的随机数序列都是固定的,所以才叫srand()函数为伪随机数生成器
伪随机数序列
种什么样的种子结什么样的果,每定义一个种子,编译器都会生成一个固定的伪随机数序列
下面我用种子srand(1)生成10个伪随机数
#include <stdio.h>
#include <stdlib.h>
int main()
{
srand(1);
for (int i = 1;i<=10; i++)//十个伪随机数
{
printf("%d\n", rand());
}
}
运行代码
十个固定的数已经由编译器生成,我使用的编译器伪**visual studio 2019**,也就是说不论我什么时候、什么地点、在别人的电脑还是在自己的电脑,只要编译器是**visual studio 2019**,种子srand(1)生成的前十个伪随机数就是这十个数.
不同编译器种子生成的伪随机数序列是不一样的,我这里是visual studio 2019环境
那我们怎么样才可以获得真正的随机数呢?其实问题很简单,我们只需要在srand()中放入一个不断变化的数就可以生成一个真正的随机数序列,
那么现实中有什么数字一直在变化呢?没错那就是时间,C中生成时间的函数就是time()函数
time()函数
头文件:#include<time.h>
函数声明:time_t time (time_t* timer);
头文件中存在 typedef _int64 time_t
其中 _int64 其实就是long long,所以time_t代表长长整型
作用:time() 函数用于获取当前系统时间的时间戳(time stamp),即自 1970 年 1 月 1 日 00:00:00 UTC 起至当前时间所经过的秒数
函数逻辑:time()函数的函数声明的函数调用符()中为time_t* timer,这里是通过指针获得时间戳,但我们更多的是使用time(NULL) 这样time(NULL)就不要创建指针,直接返回当前时间。
生成一个真正的随机数
我们可以对srand进行这样设置
srand((unsigned)time(NULL));
此时srand()函数中的种子参数是不断变化的,生成随机数也是不断变化的
time()函数是time_t型(long ong型)的,但srand函数()的种子参数需要unsigned int型的,所以这里最好使用:()强制类型转换进行转换
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int main()
{
srand((unsigned)time(NULL));//时间中作为种子
for (int i = 1; i <= 10; i++)
{
printf("%2d:%d\n", i,rand());
}
}
运行代码
如果现在如果复制这段代码,生成的十个数肯定是和我这上面生成的数是不一样的
二、使用小技巧
使用%可以将产生的随机数限制在一定的范围中
生成0~9的随机数
int a=rand()%10;printf("%d",a);
生成生成10~20的随机数
int a=10+rand%11;printf("%d",a)
%a,的取值范围是0~a-1,通过对其合理使用,可以生成符合自己要求的随机数
三、使用代码实例(简易抽卡)
在编程中,随机数的出现为我们带来了许多便利
如编写一个石头剪刀布小游戏,电脑出手可以用rand()%3生成的“0”、“1” ‘“2”分别代表“石头”、“剪刀”和“布”,等······
下面我将使用srand()、 rand()和time()生成10个取值范围为3~6随机数,用代码模拟一次十连抽卡
简易抽卡系统
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
int main()
{
int three_star = 0;
int four_star = 0;
int five_star = 0;
int six_star = 0;
srand((unsigned)time(NULL));
for (int i = 1; i <= 10; i++)
{
int a = 3 + rand() % 4;//生成3~6的随机数
switch (a)
{
case 3:three_star++; break;
case 4:four_star++; break;
case 5:five_star++; break;
case 6:six_star++; break;
}
}
printf("本次抽卡结果如下\n");
printf("三星干员:%d名\n", three_star);
printf("四星干员:%d名\n", four_star);
printf("五星干员:%d名\n", five_star);
printf("六星干员:%d名\n", six_star);
return 0;
}
运行代码
哈哈哈,运气还行,出货了一个六星,读者有兴趣的话可以复制这段代码测测运气,在评论区分享一下自己的出货情况
总结
本文介绍的是其基本原理,这里只是展示这些函数的了冰山一角,技艺高超的程序员们会对它们进行出神入化的使用
整理不易,对你有帮助的话,那就给个三联吧,谢谢了