[C语言]——分支和循环(4)

目录

 一.随机数生成

1.rand 

2.srand

3.time

4.设置随机数的范围

猜数字游戏实现


写⼀个猜数字游戏
游戏要求:
(1)电脑自动生成1~100的随机数
(2)玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束

 一.随机数生成

要想完成猜数字游戏,⾸先得产⽣随机数,那怎么产生随机数呢?

1.rand 

C语言提供了⼀个函数叫 rand,这函数是可以生成随机数的,函数原型如下所示: 

int rand (void);

rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。

 rand函数的使用需要包含⼀个头文件是:stdlib.h

 那我们就测试⼀下rand函数,这⾥多调⽤⼏次,产⽣5个随机数:

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

我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的,但是下⼀次运⾏程序⽣成的结果和上⼀次⼀模⼀样,这就说明有点问题。
如果再深⼊了解⼀下,我们就不难发现, 其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下⼀个值是多少的。而rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。 如果要⽣成不同的随机数,就要让种⼦是变化的。
int=rand(2)
int=rand(3)
int=rand(4)
......

2.srand

C语言中又提供了⼀个函数叫 srand,用来初始化随机数的生成器的,srand的原型如下:

void srand (unsigned int seed)
程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就⽭盾了。

3.time

在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。 在C语⾔中有⼀个函数叫time   ,就可以获得这个时间,time函数原型如下:
time_t time (time_t* timer);
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。

time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做 时间戳 time函数的时候需要包含头⽂件:time.h
//VS2022 上time_t类型的说明
#ifndef _CRT_NO_TIME_T
  #ifdef _USE_32BIT_TIME_T
      typedef __time32_t time_t;
  #else
      typedef __time64_t time_t;
  #endif
#endif

typedef                    long __time32_t;
typedef                    __int64 __time64_t
如果只是让time函数返回时间戳,我们就可以这样写:
time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值
那我们就可以让⽣成随机数的代码改写成如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
  //使⽤time函数的返回值设置种⼦
  //因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
  srand((unsigned int)time(NULL)); //放主函数只执行一次
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
  return 0;
}

(注:截图只是当时程序运行的结果,你的运行结果不⼀定和这个⼀样) 

srand函数是不需要频繁调⽤的,⼀次运行的程序中调用⼀次就够了

4.设置随机数的范围

如果我们要⽣成0~99之间的随机数,⽅法如下:
 rand() %100;//余数的范围是0~99
如果要⽣成1~100之间的随机数,⽅法如下:
rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100
如果要⽣成100~200的随机数,方法如下:
100 + rand()%(200-100+1)
   //余数的范围是0~100,加100后就是100~200
所以如果要生成a~b的随机数,⽅法如下:
a + rand()%(b-a+1)

二.猜数字游戏实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
 int r = rand()%100+1;
 int guess= 0;
 while(1)
 {
   printf("请猜数字>:");
   scanf("%d", &guess);
   if(guess < r)
   {
      printf("猜⼩了\n");
   }
   else if(guess > r)
   {
      printf("猜⼤了\n");
   }
   else
   {
     printf("恭喜你,猜对了\n");
     break;
   }
 } 
}
void menu()
{
 printf("***********************\n");
 printf("****** 1. play ******\n");
 printf("****** 0. exit ******\n");
 printf("***********************\n");
}
int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do
 {
   menu();
   printf("请选择:>");
   scanf("%d", &input);
   switch(input)
 {
   case 1:
     game();
     break;
   case 0:
     printf("游戏结束\n");
     break;
   default:
     printf("选择错误,重新选择\n");
     break;
 }
 }while(input);
 return 0;
}
还可以加上猜数字的次数限制,如果5次猜不出来,就算失败.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
  int r = rand() % 100 + 1;
  int guess = 0;
  int count = 5;
  while (count) //=0跳出循环
  {
     printf("\n你还有%d次机会\n", count);
     printf("请猜数字>:");
     scanf("%d", &guess);
     if (guess < r)
     {
       printf("猜⼩了\n");
     }
     else if (guess > r)
     {
       printf("猜⼤了\n");
     }
     else
     {
       printf("恭喜你,猜对了\n");
       break;
     }
 count--;
 }
 if (count == 0)
 {
 printf("你失败了,正确值是:%d\n", r);
 }
}
void menu()
{
 printf("***********************\n");
 printf("****** 1. play ******\n");
 printf("****** 0. exit ******\n");
 printf("***********************\n");
}
int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do
 {
   menu();
   printf("请选择:>");
   scanf("%d", &input);
 switch (input)
 {
  case 1:
    game();
    break;
  case 0:
    printf("游戏结束\n");
    break;
  default:
   printf("选择错误,重新选择\n");
   break;
  }
 } while (input);
 return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LaTeX】行内代码块、行间代码块的插入以及高亮(懒人版)

文章目录 思路和优点基本框架行内代码行间代码pythoncpp 所支持的语言所支持的代码风格 思路和优点 思路是listingsminted包&#xff0c; 一个负责插入代码一个负责高亮代码 这种方法显著的优点在于&#xff1a;完全不需要自定义代码风格 使用其他方法时&#xff0c;你定义好…

嵌入式学习36-TCP要点及http协议

TCP发送文件的粘包问题 1. 例&#xff1a; 发端 1.flv-------->收端 1.flv csfga 2.解决 1. sleep&#xff08;1&#xff09; 延时发送 2.自…

httprunner用例结构(前后置)

说明&#xff1a;httprunner 结合 pytest 的前后置方式 1. 用例级别前后置 1.1. setup teardown class TestCaseRefTestcase(HttpRunner):# 用例级别前后置def setup(self):logger.warning("------用例级别前置")def teardown(self):logger.warning("------用…

用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 问题描述&#xff1a;在 Windows 环境中&#xff0c;您希望通过一个 Python 脚本来实现特定的自动化任务&#xff0c;该任务需要依次运行其他多个带 argparse 命令行参数的 .py 文件。您希望找到一种简…

【jenkins】简单安装及配置(Windows环境)

前言 jenkins是一款跨平台的持续集成和持续交付、基于Java开发的开源软件&#xff0c;提供任务构建、持续集成监控的功能&#xff0c;可以使开发测试人员更方便的构建软件项目&#xff0c; 提高工作效率。Windows平台下&#xff0c;一般安装方法有2种&#xff1a;安装程序安装…

unicloud where 使用

where介绍 在uniCloud中&#xff0c;WHERE是一个用于指定查询条件的关键字。它允许用户根据特定的条件来筛选和查询云数据库中的数据。WHERE语句的基本语法格式是WHERE condition&#xff0c;其中condition表示查询条件&#xff0c;可以是一个或多个逻辑表达式组成的条件。 在…

第七十九天 WAF攻防-漏洞发现协议代理池GobyAWVSXray

第79天 WAF攻防-漏洞发现&协议&代理池&Goby&AWVS&Xray 知识点&#xff1a; 1、Http/s&Sock5协议 2、Awvs Xray&Goby代理 3、Pxoxifier进程代理使用 4、Safedog&BT&Aliyun防护 演示案例&#xff1a; Awws漏扫-Sadedog-白名单-内置 Awws漏…

使用Apache Kafka的Golang实践指南

您是否在寻找构建可扩展、高性能应用程序的方法&#xff0c;这些应用程序可以实时处理流数据&#xff1f;如果是的话&#xff0c;结合使用Apache Kafka和Golang是一个很好的选择。Golang的轻量级线程非常适合编写类似Kafka生产者和消费者的并发网络应用程序。它的内置并发原语&…

动态规划DP之背包问题3---多重背包问题

目录 DP分析&#xff1a; 优化&#xff1a; 二进制优化 例题&#xff1a; 01背包是每个物品只有一个&#xff0c;完全背包问题是每个物品有无限个。 那么多重背包问题就是 每个物品有有限个。 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件&#xff0c;每件体…

Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

在这个博主的基础上&#xff0c;增加两种情况的对比&#xff1a;https://blog.csdn.net/llllllkkkkkooooo/article/details/108068919 可重复读中幻读现象&#xff08;未使用MVCC&#xff09; 设置可重复读的隔离级别 set global transaction isolation level repeatable read…

代码随想录算法训练营第day40|343. 整数拆分 、 96.不同的二叉搜索树

a.343. 整数拆分 题目链接 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: …

掼蛋的牌型与规律(上篇)

掼蛋是一项配合类的棋牌竞技游戏&#xff0c;掼蛋的最大魅力以及最集中的特点在于变化&#xff0c;在于组牌的变数。有的掼蛋新手往往先把牌配死&#xff0c;并且直接决定好出牌计划&#xff0c;然后守株待兔。掼蛋的取胜之道在于静态组合加上动态变化。本文主要介绍一下掼蛋的…

python基础篇--学习记录2

1.深浅拷贝 l1 ["张大仙","徐凤年",["李淳刚","邓太阿"]] # 变量名对应的就是内存地址,这里就是将l1的内存地址给了l2 # 现在两个变量指向同一个内存地址,l1变化l2也会变化 l2 l1 现在的需求是l2是l1的拷贝版本,但是两者是完全分割…

七彩虹@电脑cpu频率上不去问题@控制中心性能模式cpu频率上不去@代理服务器超时@账户同步设置失败

文章目录 windows电脑cpu频率上不去新电脑的系统时间问题系统时间不准造成的具体问题举例代理超时vscode同步请求失败自动校准时间 windows电脑cpu频率上不去 问题描述,标压处理器的笔记本,cpu频率上不去 如果cpu没问题的话,就应该是系统限制了功耗导致的有的笔记本有控制中心…

本鲸:打造科技招商新引擎、实现政企资源高效对接

在当今这个快速变化的时代&#xff0c;科技创新已成为推动社会进步和经济发展的核心动力。本鲸&#xff0c;作为科技创新创业服务的平台&#xff0c;正以其独特的视角和专业服务&#xff0c;为政府和企业提供一站式科技招商解决方案&#xff0c;助力构建创新驱动的经济发展新模…

b站小土堆pytorch学习记录—— P27-P29 完整的模型训练套路

文章目录 一、定义模型&#xff08;放在model.py文件中&#xff09;二、训练三、测试四、完整的训练和测试代码 一、定义模型&#xff08;放在model.py文件中&#xff09; import torch from torch import nnclass Guodong(nn.Module):def __init__(self):super(Guodong,self)…

在vue2中使用tailwindcss(完整教程)

如果你看过好多教程之后&#xff0c;还是报错&#xff0c;无法使用tailwindcss&#xff0c;我希望本教程可以让你成功上岸。 环境要求 node&#xff1a;>v14.17.0 安装tailwindcss 由于最新的tailwind css使用post css 8版本&#xff0c;vue2框架暂时还不支持&#xff0…

Springboot + Vue用户管理系统

Springboot Vue用户管理系统 主要实现了管理员的登录&#xff0c;用户管理&#xff0c;用户的增删改查等操作&#xff0c; 技术实现&#xff0c;前端采用Vue 后端采用Springboot ,前后端分离系统&#xff0c;数据库使用mysql 还用到了redis,mybatis-plus。。。。。。。。。…

10大主流压力/负载/性能测试工具推荐

在移动应用和Web服务正式发布之前&#xff0c;除了进行必要的功能测试和安全测试&#xff0c;为了保证互联网产品的服务交付质量&#xff0c;往往还需要做压力/负载/性能测试。然而很多传统企业在试水互联网的过程中&#xff0c;往往由于资源或产品迭代速度等原因忽视了这一块工…

【Python】科研代码学习:三 PreTrainedModel, PretrainedConfig, PreTrainedTokenizer

【Python】科研代码学习&#xff1a;三 PreTrainedModel, PretrainedConfig, PreTrainedTokenizer 前言Models : PreTrainedModelPreTrainedModel 中重要的方法 tensorflow & pytorch 简单对比Configuration : PretrainedConfigPretrainedConfig 中重要的方法 Tokenizer : …