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

news2024/11/22 21:29:08

在这里插入图片描述

文章目录

  • 前言
  • 一、生成随机数
    • 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;

}

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

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


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/519208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32 partition(分区表)(15)

提示&#xff1a;本博客作为学习笔记&#xff0c;有错误的地方希望指正&#xff0c;主要参考乐鑫技术手册说明结合实例代码分析&#xff0c;结合理论知识学习后示例分析以及常见问题说明。 文章目录 一、ESP32 Partition概述二、内置分区表三、创建自定义分区表四、生成二进制分…

设备树(属性)简介

1 设备树 简单的整理记录&#xff1b; 学习参考内容&#xff1a; Linux 笔记 https://xuesong.blog.csdn.net/article/details/109522945?spm1001.2014.3001.5502正点原子-左盟主 驱动开发网络资料&#xff1a;IT界小生 https://www.zhihu.com/column/itlife 1.1 设备树简介…

springboot+freemarker+restful

什么是freemarker? FreeMarker是一种模板引擎&#xff0c;它可以用于生成各种类型的文档&#xff0c;比如HTML、XML、PDF、Word等。它可以通过简单的模板语法和数据模型来生成文档内容。与传统的JSP相比&#xff0c;FreeMarker的语法更加简洁和易读&#xff0c;并且可以很好地…

女生学习软件测试怎么样?

在IT技术行业&#xff0c;女生学习还是有很大优势的。女生相较于男生更有耐心&#xff0c;包容性强&#xff0c;心思细腻&#xff0c;对细节把控更好&#xff0c;同时还能帮助团队男女平衡&#xff0c;活跃气氛。 编程是一个只要你肯学习就会有回报的行业&#xff0c;不论男生…

1W字理解Java虚拟机——JVM

目录 一、初识JVM 二、JVM执行流程 三、内存区域划分&#xff08;JVM运行时数据区&#xff09; 3.1 本地方法栈&#xff08;线程私有&#xff09; 3.2 程序计数器&#xff08;线程私有&#xff0c;无并发问题&#xff09; 3.3 JVM虚拟机栈&#xff08;线程私有&#xff0…

【小程序】微信云托管对象存储管理

微信云托管对象存储用于存放数据或文件&#xff0c;一般用于较大数据或较大文件上传时的中转对象&#xff0c;避免直接上传到服务端&#xff0c;影响服务性能。 对象存储 开通了云托管平台后会自动开通对象存储功能。简单理解就是一个文件目录即可。 存储文件 文件名称&…

串口全双工通信与串口中断

1.串口通信编程 STC-ISP串口助手的使用&#xff1a; 文本模式和HEX模式的区别&#xff1a;文本模式就是那些可打印的字符。HEX模式就是这些可打印字符对应的16进制。它们都对应相同的ASCII码&#xff08;用十进制表示&#xff09;。 很多小白在程序编写完成后调试时会搞不清楚…

利用notepad++处理数据,再用excel做则线图

1、利用串口调试XCOM V2.8得到数据 2、利用Notepad编辑数据 利用正则表达式 删除时间戳 移除空行 继续删掉不要的数据 3、用excel生成折线图 复制数据到excel excel自动根据上文公式填充计算 输入0.1和0.2 框选0.1和0.2&#xff0c;下拉

JavaScript-jQuery的使用 + JS的案例

目录 点击更换图片 猜数字 搜索页面展示 表白墙 点击更换图片 我们先看下面这个例子: 使用input里面的button按钮, 并且利用函数, 将一个搜狗logo转换为百度logo: <!DOCTYPE html> <html lang"en"> <head><meta charset&…

Maven下载安装及IDEA配置Maven的超详细教程

Maven下载安装及IDEA配置Maven的超详细教程 1、IntelliJ IDEA 下载、安装及配置过程2、maven下载、安装、配置过程2.1 mavan下载2.2 安装2.3 配置 3、在IDEA中配置Maven3.1 进入设置界面3.2 maven配置 4、IDEAmaven创建工程示例 Maven是一个能使我们的java程序开发节省时间和精…

ssl证书过期

SSL证书验证网站所有者的身份&#xff0c;并为其访问者建立与服务器的安全加密连接。它保护他们的安全和隐私。 但SSL证书并非永远有效。与您的驾驶执照或护照一样&#xff0c;SSL证书也有过期日期。过期日期后&#xff0c;服务器的身份不再受信任。 为什么网站安全证书会过期…

C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

绪论 本章我们接着对类和对象进行探索&#xff0c;这是一个在我们c中比较重要的知识点&#xff0c;下面我们才是我们类和对象的更加深入且困难的知识点&#xff0c;希望你能通过这篇文章对类其有更加深入的了解。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看…

使用Taskflow完成简历信息提取

构建模型的步骤&#xff1a; 首先要进行数据处理&#xff0c;抽取简历文件中的数据。 首先要准备数据集&#xff0c;大赛提供的数据集中多为word文档&#xff0c;都为.docx格式&#xff0c; docx文件是基于 XML 的&#xff0c;可以包含文本&#xff0c;对象&#xff0c;样式&…

想让你的应用程序更加可靠?来了解Spring事务的回滚机制吧!

嗨&#xff0c;大家好&#xff0c;我是小米&#xff0c;今天要和大家聊一聊关于Spring框架事务的回滚源码实现。 相信对于使用Spring框架的小伙伴来说&#xff0c;事务管理肯定是非常重要的一个环节&#xff0c;事务的管理不好很容易出现各种问题&#xff0c;如数据不一致等。…

二十五:修改交易

1.功能需求 点击交易的复选框&#xff0c;然后点击修改按钮。进行数据的页面填充 1.流程图 1.代码实现 TranMapper /*** 根据id查询交易*/Tran selectTranDetailFortranId(String tranId); <!-- Tran selectTranDetailFortranId(String tranId);--><select id"…

项目集战略一致性

项目集战略一致性是识别项目集输出和成果&#xff0c;以便与组织的目标和目的保持一致的绩效领域。 本章内容包括&#xff1a; 1 项目集商业论证 2 项目集章程 3 项目集路线图 4 环境评估 5 项目集风险管理战略 项目集应与组织战略保持一致&#xff0c;并促进组织效益的实现。为…

【博客系统】页面设计(附完整源码)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、页面介绍 二、预期效果 1、博客列表页效…

刚面试了一位5年的Android开发,一问三不知,他还反怼我...

最近帮部门主管面试了很多人&#xff0c;从简历上看这些人的工作年限都不短&#xff0c;但做的都是一些传统的项目&#xff0c;想做现在大环境越来越难&#xff0c;大家找工作都不容易&#xff0c;就打算见一见。 在沟通中发现&#xff0c;由于年限不小&#xff0c;他们的定位…

十、Feign客户端

目录 1、在springcloud-order项目中引入Feign客户端的依赖 2、在server-order服务的启动类中添加注解EnableFeignClients 3、使用FeignClient注解声明Feign客户端需要调用的远程接口 3.1、server-pay服务提供远程接口Controller 3.2、server-member服务提供远程接口Contro…

ES基础知识总结含SQL、DSL、GOLANG

一、简介 Elasticsearch是一个基于Lucene的全文搜索和分析引擎&#xff0c;Lucene Core是一个完全用Java编写的高性能、全功能搜索引擎库。 它可以快速地存储、实时搜索和分析大量数据。 它可以扩展到上百台服务器&#xff0c;处理PB级数据。PB 2^50 Byte&#xff0c; 在数…