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

在这里插入图片描述


前言

本文将详细解释如何在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;

}

运行代码
在这里插入图片描述

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


总结

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

  • 51
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿福爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值