C语言rand随机数知识解析和猜数字小游戏

news2024/10/7 16:27:08

rand随机数

rand

C语言中提供了一个可以随机生成一个随机数的函数:rand()
函数原型:

int rand(void);

rand函数返回的值的区间是:0~RAND_MAX(32767)之间。大部分编译器都是32767。

#include<stdlib.h>
int main()
{
	printf("%d", RAND_MAX);
	return 0;
}

在这里插入图片描述
要想使用这个rand函数需要包含头文件:#include<stdlib.h>
但是rand函数直接使用是提供的伪随机数,这个随机数是有有迹可循的,没有实现真正的随机,这是因为它生成这个数是基于一个确定的算法而生成的。

int main()
{
	int x = rand();
	int y = rand();
	printf("%d  %d\n", x, y);

	return 0;
}

执行第一次:
在这里插入图片描述

执行第二次
在这里插入图片描述

可以看出两次执行的随机数相同,所以单纯使用rand函数生成不了真正的随机数。
所以,要想真正实现随机生成,需要使rand() 函数基于一个种子(seed)来生成,默认情况下,这个种子是1。
每次调用 rand(),它都会基于前一个随机数生成下一个随机数。这意味着如果你多次使用相同的种子调用 rand(),你会得到相同的随机数序列。

srand

C语言又提供了一个初始化随机数的函数:srand()
函数原型:

void srand(unsigned int seed);

注意:seed的数据类型是unsigned int
在程序中显示有srand函数确定一个种子,只要种子在变化,rand()函数生成的随机数也就在变化。也就是说只要srand的种子是随机的,rand就能生成随机数,在生成随机数的同时又生成一个随机数,这就矛盾了。所以种子的随机不能由我们来确定,所以我们交给time()函数

time

在程序中我们一般使用程序运行时间作为种子的,因为时间时刻在发生变化,就省去我们去随机种子了。
在C语言中有一个表示时间的函数:time()
函数原型:

time_t time(time_t* timer);

timer是一个可选的参数,如果提供了这个参数,那么函数会将返回的时间(从1970年1月1日00:00:00 开始到现在的秒数)存储在这个参数指向的变量中。如果这个参数是NULL,那么函数只返回时间值而不存储它。
要想使用time(),需要头文件:#include<time.h>
代码实现:

#include<time.h>
#include<stdio.h>
int main() {
	printf("%d",time(NULL));
	return 0;
}

在这里插入图片描述

这是一个时间戳,就是从1970年1月1日00:00:00 开始到现在的秒数。

  1. 先在浏览器中找一个可以转换时间戳的网站
    在这里插入图片描述

  2. 将代码结果复制并放在转换工具里,就可以看到当前时间
    在这里插入图片描述

所以我们用time()函数的返回值充当srand()函数的参数,就可以返回一个随机值了。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main() {
	srand((unsigned int)time(NULL));
	int x = rand();
	int y = rand();
	printf("%d %d\n", x, y);
	return 0;
}

执行第一次:
在这里插入图片描述

执行第二次:
在这里插入图片描述

这样就可实现随机值生成了。

设置随机数的范围

当我们可以生成随机数的时候就可以设置随机数生成范围了,上文说过随机数生成范围是0—32767,我们可以要rand()%100就可以得到得到0—99之间的数了,这是因为不管什么数对100求余,只能得到0—99的数。
所以:

生成0~99之间的随机数

rand() %100

生成1~100之间的随机数

rand() %100+1;

生成a~b之间的随机数

a + rand() % (b-a+1);

猜数字小游戏

问题:

写一个随机猜数字小游戏,只有10次机会,超过则失败

规则

  1. 电脑自动生成1~100的随机数
    2.玩家猜数字,猜数字过程中,根据数据的大小给出大了或者小了的反馈,在10次猜测中,猜对了,则游戏结束。

代码实现

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void interface(void) {//游戏界面
	printf("******************\n");
	printf("****1 游戏开始****\n");
	printf("****2 退出游戏****\n");
	printf("******************\n");
}
void game(void) {
	int type = 10;//只有10次猜测机会
	int result = rand() % 100 + 1;//产生1~100之间的随机数
	int guess = 0;
	while (type) {//只有还有机会时才进入循环
		printf("还有%d次机会", type);
		printf("请猜测数字:>");
		scanf("%d", &guess);
		if (guess < result) {
			printf("猜小了\n");
		}
		else if (guess > result) {
			printf("猜大了\n");
			}
		else {
			printf("恭喜!猜对了\n");
			break;
		}
		type--;//while循环一次机会少一次
	}
	if (type == 0) {
		printf("机会用完了,答案是:%d\n", result);
	}
}
int main() {//控制是玩游戏还是退出游戏
	srand((unsigned int)time(NULL));//设置种子,以确保生成正确的随机数
	int n = 0;
	do {
		interface();//调用界面函数
		printf("请选择:>");
		scanf("%d", &n);//选则游戏模式
		switch (n) {
		case 1:
			game();
			break;
		case 2:
			printf("游戏结束\n");
			break;
		default :
			printf("选择错误,重新选择:>\n");
			break;
		}
	} while (n);//当选则了再进入循环
	return 0;
}

在这里插入图片描述

易错点

这段代码可能有几个易错点,我一一指出:
1.
在这里插入图片描述
如果把产生随机数的代码放在循环里面,那么每次猜测都是一个新的随机数,那么只有一次机会可以猜测。
2.
在这里插入图片描述
这里把大小于关系写错了,那么根据提示就永远也猜不出答案了。
3.
在这里插入图片描述
这里把种子函数放在循环里面了,这样做的后果是随机生成的值相似甚至相同。这是因为time(NULL) 返回的时间值在两次迭代之间几乎没有变化,导致种子几乎相同,进而产生相似的随机数序列。
可以代码验证一下:


int main() {
	while (1) {
		srand((unsigned int)time(NULL));
		printf("%d\n", rand());
	}

	return 0;
}

在这里插入图片描述
所以写这个代码时应该注意。
在这里插入图片描述

/考研势在必行/

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

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

相关文章

hummingbird,一个便于将模型部署到边缘设备的Python库!

前言 随着人工智能和机器学习的快速发展&#xff0c;将训练好的模型部署到生产环境中成为了一个重要的任务。而边缘计算设备&#xff0c;如智能手机、嵌入式系统和物联网设备&#xff0c;也需要能够运行机器学习模型以进行实时推理。Python Hummingbird 是一个强大的工具&…

Java学习笔记2024/2/8

面向对象 //面向对象介绍 //面向: 拿、找 //对象: 能干活的东西 //面向对象编程: 拿东西过来做对应的事情 //01-如何设计对象并使用 //1.类和对象 //2.类的几个不错注意事项 1. 类和对象 1.1 类和对象的理解 客观存在的事物皆为对象 &#xff0c;所以我们也常常说万物皆对…

基于springboot会员制医疗预约服务管理信息系统源码和论文

会员制医疗预约服务管理信息系统是针对会员制医疗预约服务管理方面必不可少的一个部分。在会员制医疗预约服务管理的整个过程中&#xff0c;会员制医疗预约服务管理系统担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类的管理系统也在不断改进。本课题所设计…

Web课程学习笔记--JavaScript操作DOM常用的API

JavaScript操作DOM常用的API 1 什么是DOM 文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述&#xff0c;并定义了一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式和内容。 文档对象模型 (DOM) 是对HTML文…

springboot 拦截器

定义 拦截器类似于javaweb中filter 功能 注意: 只能拦截器controller相关的请求 作用 举一个例子&#xff0c;例如我们在Controller中都有一段业务逻辑&#xff0c;这样我们就可以都统一放在拦截器中 因此拦截器的作用就是将controller中共有代码放入到拦截器中执行,减少co…

【算法与数据结构】496、503、LeetCode下一个更大元素I II

文章目录 一、496、下一个更大元素 I二、503、下一个更大元素II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、496、下一个更大元素 I 思路分析&#xff1a;本题思路和【算法与数据结构】739、LeetCode每日温度类似…

【VTKExamples::PolyData】第二十四期 InterpolateTerrain

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例InterpolateTerrain,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. InterpolateTerrain 输出: Interp…

精灵图,字体图标,CSS3三角

精灵图 1.1为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁的接受和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减少…

深入Java容器:概览、设计模式与源码分析

深入Java容器&#xff1a;概览、设计模式与源码分析 Java 容器一、概览Collection1. Set2. List3. Queue Map 二、容器中的设计模式迭代器模式适配器模式 三、源码分析ArrayList1. 概览2. 扩容3. 删除元素4. 序列化5. Fail-Fast Vector1. 同步2. 扩容3. 与 ArrayList 的比较4. …

Java与MySQL的精准结合:打造高效审批流程

1流程思路分析 审批流程&#x1f431;‍&#x1f4bb; 1.串行流程 当前节点审批完成后&#xff0c;下一次节点才能进行操作&#xff0c;例如经理通过之后&#xff0c;总监才能审批&#xff1b; 2.并行流程 一个审批节点需要多人联审。一般有两种方式&#xff1a;会签、或签…

Python中的嵌套字典访问与操作详解

前言 在Python编程中&#xff0c;嵌套字典是一种常见的数据结构&#xff0c;它可以以层次结构的方式组织和存储数据。嵌套字典通常包含字典内嵌套在其他字典中&#xff0c;创建了一种多层级的数据结构。本文将详细介绍如何在Python中访问和操作嵌套字典&#xff0c;包括访问、…

视频无损放大修复工具Topaz Video AI 新手入门教程

想要自学Topaz Video AI &#xff1f;Topaz Video AI 如何使用&#xff1f;这里给大家带来了视频无损放大修复工具Topaz Video AI 新手入门教程&#xff0c;快来看看吧&#xff01; 下载&#xff1a;Topaz Video AI for mac 导入您的文件 有两种方法可以将文件导入 Topaz Vid…

C++重新入门-C++变量作用域

目录 1.C变量定义 2.C作用域 3.局部变量 4.全局变量 5.块作用域变量 6.初始化局部变量和全局变量 1.C变量定义 一般来说有三个地方可以定义变量&#xff1a; 在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 在函数参数的定义中声明的变量&#xff0c;称为…

【博云2023】乘龙一跃腾云海,侧目抬手摘星河

癸卯渐远&#xff0c;甲辰渐至&#xff0c;预示着被汗水浇灌的种子&#xff0c;必将顶开冻土&#xff0c;迎接阳光。 每逢春节&#xff0c;当亲友彼此问候&#xff0c;博云人总能自豪地说&#xff0c;我们认真地、努力地奋斗&#xff0c;让我们能自信地踏上新的征程。 我们的…

架构(十二)动态Excel

一、引言 作者最近的平台项目需要生成excel&#xff0c;excel的导入导出是常用的功能&#xff0c;但是作者想做成动态的&#xff0c;不要固定模板&#xff0c;那就看看怎么实现。 二、后端 先捋一下原理&#xff0c;前后端的交互看起来是制定好的接口&#xff0c;其实根本上是…

安全的接口访问策略

渗透测试 一、Token与签名 一般客户端和服务端的设计过程中&#xff0c;大部分分为有状态和无状态接口。 一般用户登录状态下&#xff0c;判断用户是否有权限或者能否请求接口&#xff0c;都是根据用户登录成功后&#xff0c;服务端授予的token进行控制的。 但并不是说有了tok…

4核8G服务器配置性能怎么样?12M带宽配置服务器能干什么?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

16.1 Spring框架_SpringIoC容器与Bean管理(❤❤❤❤)

16.1 Spring框架_SpringIoC容器与Bean管理 1. Spring IOC1.1 IoC控制反转 1. Spring IOC 1.1 IoC控制反转 需要自己查找3种苹果的特色,从而选择符合自己的需求 告诉水果店老板自己的口味,由老板推荐哪种苹果,省去自己查询水果特点 在java中,各种水果就是各种对象,买水果就是创…

问题:2、计算机网络的目标是实现________。 #媒体#知识分享

问题&#xff1a;2、计算机网络的目标是实现________。 A&#xff0e;数据处理 B&#xff0e;信息传输与数据处理 C&#xff0e;资源共享与信息传输 D&#xff0e;文献查询 参考答案如图所示

【用pycharm安装第三方库时出现错误】【‘pip‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。】

目录 一、问题描述 二、解决过程 1、pip的版本不是最新版本导致安装不了第三方库 2、pip最新版本安装出错 3、pip 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件” 4、 ERROR: Could not find a version that satisfies the requirement PIL (from versi…