当前位置: 首页 > news >正文

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

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;
}

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

/考研势在必行/

相关文章:

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

rand随机数 rand C语言中提供了一个可以随机生成一个随机数的函数&#xff1a;rand&#xff08;&#xff09; 函数原型&#xff1a; int rand(void);rand函数返回的值的区间是&#xff1a;0~RAND_MAX(32767)之间。大部分编译器都是32767。 #include<stdlib.h> int ma…...

django中的缓存功能

一&#xff1a;介绍 Django中的缓存功能是一个重要的性能优化手段&#xff0c;它可以将某些耗时的操作&#xff08;如数据库查询、复杂的计算等&#xff09;的结果存储起来&#xff0c;以便在后续的请求中直接使用这些缓存的结果&#xff0c;而不是重新执行耗时的操作。Django…...

三、搜索与图论

DFS 排列数字 #include<iostream> using namespace std; const int N 10; int a[N], b[N]; int n;void dfs(int u){if(u > n){for(int i 1; i < n; i)cout<<a[i]<<" ";cout<<endl;return;}for(int i 1; i < n; i){if(!b[i]){b[…...

【翻译】Processing安卓模式的安装使用及打包发布(内含中文版截图)

原文链接在下面的每一章的最前面。 原文有三篇&#xff0c;译者不知道贴哪篇了&#xff0c;这篇干脆标了原创。。 译者声明&#xff1a;本文原文来自于GNU协议支持下的项目&#xff0c;具备开源二改授权&#xff0c;可翻译后公开。 文章目录 Install&#xff08;安装&#xff0…...

MATLAB图像处理——边缘检测及图像分割算法

1.检测图像中的线段 clear clc Iimread(1.jpg);%读入图像 Irgb2gray(I); %转换为灰度图像 h1[-1, -1. -1; 2, 2, 2; -1, -1, -1]; %模板 h2[-1, -1, 2; -1, 2, -1; 2, -1, -1]; h3[-1, 2, -1; -1, 2, -1; -1, 2, -1]; h4[2, -1, -1; -1, 2, -1; -1, -1, 2]; J1imfilter(I, h1)…...

探索设计模式:原型模式深入解析

探索设计模式&#xff1a;原型模式深入解析 设计模式是软件开发中用于解决常见问题的标准解决方案。它们不仅能提高代码的可维护性和可复用性&#xff0c;还能让其他开发者更容易理解你的设计决策。今天&#xff0c;我们将聚焦于创建型模式之一的原型模式&#xff08;Prototyp…...

IAR报错解决:Fatal Error[Pe1696]: cannot open source file “zcl_ha.h“

报错信息 Fatal Error[Pe1696]: cannot open source file "zcl_ha.h" K:\Z-Stack 3.0.2\Projects\zstack\Practice\SampleSwitch\Source\zcl_samplesw_data.c 51 意思是找不到zcl_ha.h文件 找不到的理由可能是我把例程复制了一份到别的文件目录下&#xff0c;少复制…...

Qt网络编程-ZMQ的使用

不同主机或者相同主机中不同进程之间可以借助网络通信相互进行数据交互&#xff0c;网络通信实现了进程之间的通信。比如两个进程之间需要借助UDP进行单播通信&#xff0c;则双方需要知道对方的IP和端口&#xff0c;假设两者不在同一主机中&#xff0c;如下示意图&#xff1a; …...

如何清理Docker占用的磁盘空间?

在Docker中&#xff0c;随着时间的推移&#xff0c;占用的磁盘空间可能会不断增加。为了保持系统的稳定性和性能&#xff0c;定期清理Docker占用的磁盘空间非常重要。下面将介绍一些清理Docker磁盘空间的方法。 一、清理无用的容器 有时候&#xff0c;我们可能会运行一些临时…...

从零开始学HCIA之NAT基本工作原理

1、NAT设计之初的目的是解决IP地址不足的问题&#xff0c;慢慢地其作用发展到隐藏内部地址、实现服务器负载均衡、完成端口地址转换等功能。 2、NAT完成将IP报文报头中的IP地址转换为另一个IP地址的过程&#xff0c;主要用于实现内部网络访问外部网络的功能。 3、NAT功能一般…...

Day40- 动态规划part08

一、单词拆分 题目一&#xff1a;139. 单词拆分 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以…...

论文笔记:相似感知的多模态假新闻检测

整理了RecSys2020 Progressive Layered Extraction : A Novel Multi-Task Learning Model for Personalized Recommendations&#xff09;论文的阅读笔记 背景模型实验 论文地址&#xff1a;SAFE 背景 在此之前&#xff0c;对利用新闻文章中文本信息和视觉信息之间的关系(相似…...

5G技术对物联网的影响

随着数字化转型的加速&#xff0c;5G技术作为通信领域的一次重大革新&#xff0c;正在对物联网&#xff08;IoT&#xff09;产生深远的影响。对于刚入行的朋友们来说&#xff0c;理解5G技术及其对物联网应用的意义&#xff0c;是把握行业发展趋势的关键。 让我们简单了解什么是…...

Nacos1.X源码解读(待完善)

目录 下载源码 注册服务 客户端注册流程 注册接口API 服务端处理注册请求 设计亮点 服务端流程图 下载源码 1. 克隆git地址到本地 # 下载nacos源码 git clone https://github.com/alibaba/nacos.git 2. 切换分支到1.4.7, maven编译(3.5.1) 3. 找到启动类com.alibaba.na…...

算法之双指针系列1

目录 一&#xff1a;双指针的介绍 1&#xff1a;快慢指针 2&#xff1a;对撞指针 二&#xff1a;对撞指针例题讲述 一&#xff1a;双指针的介绍 在做题中常用两种指针&#xff0c;分别为对撞指针与快慢指针。 1&#xff1a;快慢指针 简称为龟兔赛跑算法&#xff0c;它的基…...

苍穹外卖面试题

8. 如何理解分组校验 很多情况下&#xff0c;我们会将校验规则写到实体类中的属性上&#xff0c;而这个实体类有可能作为不同功能方法的参数使用&#xff0c;而不同的功能对象参数对象中属性的要求是不一样的。比如我们在新增和修改一个用户对象时&#xff0c;都会接收User对象…...

【Qt 学习之路】在 Qt 使用 ZeroMQ

文章目录 1、概述2、ZeroMQ介绍2.1、ZeroMQ 是什么2.2、ZeroMQ 主线程与I/O线程2.3、ZeroMQ 4种模型2.4、ZeroMQ 相关地址 3、Qt 使用 ZeroMQ3.1、下载 ZeroMQ3.2、添加 ZeroMQ 库3.3、使用 ZeroMQ3.4、相关 ZeroMQ 案例 1、概述 今天是大年初一&#xff0c;先给大家拜个年&am…...

CI/CD到底是啥?持续集成/持续部署概念解释

前言 大家好&#xff0c;我是chowley&#xff0c;日常工作中&#xff0c;我每天都在接触CI/CD&#xff0c;今天就给出我心中的答案。 在现代软件开发中&#xff0c;持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续部署&#xff08;Continuous D…...

golang常用库之-disintegration/imaging图片操作(生成缩略图)

文章目录 golang常用库之什么是imaging库导入和使用生成缩略图 golang常用库之 什么是imaging库 官网&#xff1a;https://github.com/disintegration/imaging imaging 是一个 Go 语言的图像处理库&#xff0c;它提供了一组功能丰富的函数和方法&#xff0c;用于进行各种图像…...

CSS 控制 video 标签的控制栏组件的显隐

隐藏下载功能 <video src"" controlsList"nodownload" />controlslist 取值如下(设定多个值则使用空格进行间隔) 如&#xff1a;controlslist"nodownload nofullscreen noremoteplayback"nodownload&#xff1a;取消更多控件弹窗的下载功…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...