C语言生成随机数【简易抽卡代码为例】

C语言生成随机数【简易抽卡代码为例】_第1张图片

文章目录

  • 前言
  • 一、生成随机数
    • rand() 函数
    • srand()函数
    • time()函数
    • 生成一个真正的随机数
  • 二、使用小技巧
  • 三、使用代码实例(简易抽卡)
  • 总结


前言

本文将详细解释如何在C语言中生成随机数,并介绍应用的小技巧


一、生成随机数

c语言生成一个真正的随机数需要用到三个函数:rand()、srand()和time()。

函数介绍

rand() 函数

头文件#include
函数声明int rand(void)
作用生成一个伪随机数序列,随机数取值范围是0~RAND_MAX

PS - RAND_MAX其实是一个宏名,在头文件中存在宏定义
#define RAND_MAX 32767
不同的编译器会将它定义为不同的数值,本文使用的编译器讲它定义成了32767

函数逻辑函数声明中函数调用符号()中是void,所以不需要参数,函数rand()就会返回一个伪随机数 rand()函数和srand()函数一定是配合使用的,rand()函数只靠自己生成不了随机数,必须要在srand()函数中设置种子(起点)rand()函数才会返回随机数。rand()函数调用前会检查是否定义了srand(),如果没有定义将自动生成srand(1)并且调用它


srand()函数

头文件#include
函数声明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 
#include 

int main()
{
	srand(1);
	for (int i = 1;i<=10; i++)//十个伪随机数
	{
		printf("%d\n", rand());
	}
	
}

运行代码
C语言生成随机数【简易抽卡代码为例】_第2张图片

十个固定的数已经由编译器生成,我使用的编译器伪**visual studio 2019**,也就是说不论我什么时候、什么地点、在别人的电脑还是在自己的电脑,只要编译器是**visual studio 2019**,种子srand(1)生成的前十个伪随机数就是这十个数.

不同编译器种子生成的伪随机数序列是不一样的,我这里是visual studio 2019环境

那我们怎么样才可以获得真正的随机数呢?其实问题很简单,我们只需要在srand()中放入一个不断变化的数就可以生成一个真正的随机数序列,
那么现实中有什么数字一直在变化呢?没错那就是时间,C中生成时间的函数就是time()函数


time()函数

头文件#include
函数声明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 
#include 
#include

int main()
{
	
	
	srand((unsigned)time(NULL));//时间中作为种子
	for (int i = 1; i <= 10; i++)
	{
		printf("%2d:%d\n", i,rand());
	}

}

运行代码
C语言生成随机数【简易抽卡代码为例】_第3张图片
如果现在如果复制这段代码,生成的十个数肯定是和我这上面生成的数是不一样的

二、使用小技巧

使用%可以将产生的随机数限制在一定的范围中
生成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 
#include 
#include

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;

}

运行代码
C语言生成随机数【简易抽卡代码为例】_第4张图片

哈哈哈,运气还行,出货了一个六星,读者有兴趣的话可以复制这段代码测测运气,在评论区分享一下自己的出货情况


总结

本文介绍的是其基本原理,这里只是展示这些函数的了冰山一角,技艺高超的程序员们会对它们进行出神入化的使用
整理不易,对你有帮助的话,那就给个三联吧,谢谢了

你可能感兴趣的:(c语言,c++,算法)