6.生成随机数、猜数字游戏(rand函数、srand函数、time函数)

news2024/11/18 15:50:09

猜数字游戏

    • 1.生成随机数
      • 1.1 rand函数
      • 1.2 srand函数
      • 1.3 time函数
      • 1.4 设置随机数的范围
    • 2.猜数字游戏

1.生成随机数

1.1 rand函数

函数原型如下:

int rand(void);

所需头文件:stdlib.h

作用:调用后随机返回一个伪随机数,随机数范围为0~RAND_MAX之间,大部分编译器上为32767(rand函数 ctrl+鼠标左键 打开 里面定义为:#define RAND_MAX 0x7fff

伪随机数:之所以是伪随机数,是因为rand()函数是基于一个叫"种子(seed)"的基准值运算生成随机数的。
关于种子seed:rand函数中默认种子基准值为1
所以要使用srand()函数(后面会提到)来初始化seed的基准值

示例:

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

我这里调用了3次rand函数,结果如下:
41
18467
6334
接下来我又重新反复执行程序多次,结果随机数没变,一直是这几个数
这里就是所谓的伪随机数,所以,通过调用srand()函数改变**种子(seed)**来实现随机数的真正变化

1.2 srand函数

函数原型如下:

void srand(unsigned int seed);
srand()中参数为一个非负的整型seed
这个非负的整型seed,就是所谓的种子,决定rand()函数返回的随机数

作用:初始化随机数的生成器
函数本质:即srand(unsigned int seed)中seed得是随机的,rand()函数才能生成真正的随机数

问题:听上去是不是有点矛盾?
rand()生成随机数 需要seed为随机值,
srand(seed)定义seed时,也需要一个随机值,rand的随机数都还没生成,那随机数哪里来呢?

解决方法:只要seed值时刻发生变化,就可以使rand调用函数时每次都不一样
所以接下来要用到time()函数

1.3 time函数

原因:使用程序运行的时间来作为种子的初始值,因为时间时刻在发生变化

函数原型如下:

time_t time(time_t * timer);

所需头文件:time.h

作用:time()函数 参数为NULL时,返回当前时间戳;如果timer为非NULL指针的话,函数会将时间戳放到timer指向的内存中带回去

时间戳:即1970年1月1日0时0分0秒到现在程序运行的时间差值,单位是秒
返回类型为time_t,本质上就是long(32位长整型)或者long long(64位长整型)

示例:生成随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
	//time()函数 参数为NULL时,返回当前时间戳,作为种子
	//因为srand函数的参数时unsigned int类型,所以将time函数的返回值类型强制转换
	unsigned int seed = (unsigned int)time(NULL);
	//初始化seed
	srand(seed);
	//调用rand() 并打印随机数
	printf("调用随机值(整型):%d\n", rand());
	return 0;
} 

结果:随着时间时刻在变化,每次生成的随机数都不一样
注:srand函数在一个程序中只需要调用一次即可,不需要反复调用!

1.4 设置随机数的范围

例如:我们要生成0~99之间的随机数,方法如下

 rand() % 100;//余数的范围为0~99

原理:
rand()返回值的范围为0-32767,按照位数来看,范围为【万位~个位】
万位级别的数 % 100 = 此数后两位 例:32699 % 100 = 99    32600 % 100 = 0
千位级别的数 % 100 = 此数后两位 例:3299 % 100 = 99    3200 % 100 = 0
百位级别的数 % 100 = 此数后两位 例:199 % 100 = 99    100 % 100 = 0
个、十位级别的数 % 100 = 此数本身 例:99 % 100 = 99    0 % 100 = 0

根据上述结论,要生成1~100之间的随机数,方法如下

 rand() % 100 + 1;//余数的范围为1~100



若要生成100~200之间的随机数,方法如下

 100 + rand() % (200 - 100 + 1);//余数的范围为0~100,加100后就是100~200

总结:如果要生成a-b之间的随机数,方法如下

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

2.猜数字游戏

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game() {
	int num = rand() % 100 + 1;//生成随机数(范围1-100)
	int guess = 0;//初始化 输入猜的数字
	int count = 5;//设置挑战次数

	while (count)
	{
		printf("你还有%d次机会,请输入你猜的数字:",count);
		scanf("%d", &guess);
		
		if (guess < num)
		{
			printf("猜小了\n");
			
		}
		else if (guess > num)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("猜对了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("你失败了,正确答案是:%d\n",num);
	}
}

void menu() {

	printf("********************\n");
	printf("***  1.开始游戏  ***\n");
	printf("***  2.退出游戏  ***\n");
	printf("********************\n");
}

int main() {
	int input = 0;
	srand((unsigned int)time(NULL));//初始化种子,让rand()可以调用随机数
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 2:
			printf("游戏结束\n");

			//这里的break跳出的是switch结构,不用goto弹出游戏结束后还会继续循环菜单
			goto out;
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);

	out:
	printf("成功退出游戏");
	return 0;
}

运行效果
在这里插入图片描述

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

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

相关文章

QtXlsx: no such file or directory

Qt项目&#xff0c;引用了QtXlsx&#xff0c;准备运行&#xff0c;提示报错&#xff1a; QtXlsx: No such file or directory 奇怪。按理说&#xff0c;安装QtXlsx的三个步骤都已经执行成功了&#xff1a; qmake make make install 把生成的so库文件拷贝到相关目录也是无效。…

解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo

&#x1f600;前言 解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#x…

c++ 的reinterpret_cast 与const_cast 类型转换举例

&#xff08;1&#xff09;const_cast 转换&#xff0c;可以使得给常量赋值。reinterpret_cast 转换&#xff0c;可以把一种类型转换为无关的另一种类型。 图中给出了一个例子。成功给指针 p 写进去了内容。先去除指针p 的常量属性&#xff0c;再把p这个变量当成 B 类型的变量…

C语言之#define以及预处理详讲解

目录 #define #define的使用方法 #define 替换规则 #和##的作用 带副作用的宏参数 宏和函数对比 #undef 文件包含 头文件被包含的方式&#xff1a; 嵌套文件包含 在C语言中&#xff0c;一段程序运行时会执行四个步骤&#xff1a;预编译、编译、汇编、链接。在程序预编…

初学者如何选择自己的第一种编程语言?

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

Just Mask and Sum 手搓 自然语言模型

背景 在这个每天都能看到&#xff0c;各种新LLM论文&#xff0c;出现的今天&#xff0c;大家讨论的都是如何将transformer &#xff0c;或者说是将attention 进行线性化。 很少有人讨论&#xff0c;注意力机制是必要的吗&#xff08;attention is must&#xff09;&#xff1f;…

CentOS 7.6使用yum安装stress,源码安装stree-ng 0.15.06,源码安装sysstat 12.7.2

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core)&#xff0c;uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64 yum install stress sysstat -y安装stress和sysstat。 使用pidstat -u 5 1没有%wait项&#xff1a; 原因是CentOS 7仓…

数电模电基础知识学习笔记汇总

文章目录&#xff1a; 数电和模电的关系 一&#xff1a;模电学习笔记 二&#xff1a;数电学习笔记 三&#xff1a;福利 1.NI Multisim14.0电路仿真软件的下载安装 2.进制转换 3.电路常用公式 4.好的参考笔记 4.1 笔记 3.1.1 模电 3.1.1 数电 4.2 网站 5.八股文 …

LeetCode130.Surrounded-Regions<被围绕的区域>

题目&#xff1a;被围绕的区域 思路&#xff1a; 好吧&#xff0c;这题不会。 bfs递归 dfs非递归 dfs并查集 - 被围绕的区域 - 力扣&#xff08;LeetCode&#xff09; 将问题转化为与边界O相连的O。有点像岛屿问题了。 代码是&#xff1a; //codeclass Solution { public:vo…

【ARM】内核驱动之设备树的学习-长文

❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑! 文章目录 一、什么是设备树,为什么叫设备树?二、如何编译设备树?三、…

妙用指针实现qsort

妙用指针实现qsort qsort是什么qsort代码使用例子冒泡排序引言冒泡排序模拟qsort函数 qsort是什么 是一个可以对任意类型进行排序的函数 函数为&#xff1a; void qsort(void *base,size_t nmemb,size_t size,int (*compar)(const void *, const void *));参数解释 参数base …

【数据结构与算法】基数排序

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…

学C的第三十一天【通讯录的实现】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十天【自定义类型&#xff1a;结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求&#xff1a; 实现一个通讯录&#xff0c; 通讯录中存放保存人的信息&#xff1…

【WebGL】初探WebGL,我了解到这些

WebGL&#xff08;Web图形库&#xff09;是一种强大的技术&#xff0c;允许您在Web浏览器中直接创建交互式的3D图形和动画。它利用现代图形硬件的能力来呈现令人惊叹的视觉效果&#xff0c;使其成为Web开发人员和计算机图形爱好者必备的技能。 WebGL基础知识 WebGL基于OpenGL …

1.3 eureka+ribbon,完成服务注册与调用,负载均衡源码追踪

本篇继先前发布的1.2 eureka注册中心&#xff0c;完成服务注册的内容。 目录 环境搭建 采用eurekaribbon的方式&#xff0c;对多个user服务发送请求&#xff0c;并实现负载均衡 负载均衡原理 负载均衡源码追踪 负载均衡策略 如何选择负载均衡策略&#xff1f; 饥饿加载…

数据结构07:查找[C++][线性查找]

图源&#xff1a;文心一言 考研笔记整理~&#x1f95d;&#x1f95d; 在数据结构和算法中&#xff0c;查找是一种常见的操作&#xff0c;它的目的是在一个数据集合中找到一个满足条件的元素。本文将介绍三种常用的查找方法&#xff0c;分别是顺序查找、折半查找和分块查找~&a…

61 # http 数据处理

node 中的核心模块 http 可以快速的创建一个 web 服务 const http require("http"); const url require("url");// req > request 客户端的所有信息 // res > respone 可以给客户端写入数据 const server http.createServer();server.on("r…

使用Spring Boot AOP实现日志记录

目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目&#xff0c;无需选择依赖 2.2 设置好本地Maven配置后&#xff0c;在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务 2.5 在单元测试运行结果 …

机器学习--课后作业--hw1

机器学习(课后作业–hw1) 本篇文章全文参考这篇blog 网上找了很多教程&#xff0c;这个是相对来说清楚的&#xff0c;代码可能是一模一样&#xff0c;只是进行了一些微调&#xff0c;但是一定要理解这个模型具体的处理方法&#xff0c;这个模型我认为最巧妙的它对于数据的处理…

【1.4】Java微服务:服务注册和调用(Eureka和Ribbon实现)

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 微服务 ✨特色专栏&#xff1a; 知识分享 &#x…