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

【C语言】一文吃透C语言分支循环中的rand、srand与time函数

📌 相关专栏

  • 【Linux专栏】
  • 【C语言专栏】
  • 【测试专栏】
  • 【MySQL专栏】

📌 相关文章推荐

  • 【Linux】Socket编程UDP
  • 【Linux专栏】
  • 【C语言专栏】
  • 【测试专栏】

很高兴你点开这篇文章✨

这里会持续更新我喜欢的内容,关注我,一起慢慢变好呀

👍 点赞 ⭐ 收藏 💬 评论


文章目录

  • 前言
  • 1、rand
  • 2、srand
  • 3、time
  • 4、随机数范围的设置
  • 5、猜数字游戏

前言

  • 在C语言的学习路上,分支与循环是构建程序逻辑的基础,而随机数生成则是很多趣味项目(比如猜数字、小游戏)的核心功能。很多刚接触C语言的同学,在第一次使用 rand() 函数时,都会遇到一个共同的问题:为什么每次运行程序,生成的“随机数”都是一样的?

  • 这篇文章就来帮你彻底搞懂 rand() 、 srand() 和 time() 这三个函数的底层逻辑与正确用法,结合分支与循环的知识点,带你从“只会调用函数”到“真正理解随机数的生成原理”,解决新手最容易踩的坑。


1、rand

rand用来生成随机数的

intrand(void);
  • rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器是32767。

🐾 它的头文件是 stdlb.h

  • 我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的,但是下⼀次运⾏程序⽣成的结果和上⼀次⼀模⼀样,这就说明有点问题。

  • 如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。

  • 之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1

  • 如果要⽣成不同的随机数,就要让种⼦是变化的。

🐶 🐾 ✨ 🐾 🐶


2、srand

srand是用来初始化随机数的

voidsrand(unsignedintseed);
  • 程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。

  • 那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就⽭盾了。


3、time

在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。这时候就用到----time。

time_ttime(time_t*timer);
  • time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型

  • time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。

  • 如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

time(NULL);

🐾 time函数的头文件是:time.h


可见,打印出来的随机值都不一样。

💡 :rand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了

🐶 🐾 ✨ 🐾 🐶


4、随机数范围的设置

🐾 如果我们要生成0~99之间的随机数,要怎么做呢?

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

🐾 那1~100呢?

rand()%100+1//%100的余数是0~99,0~99的数字+1,范围是1~100

🐾 那100~200呢?

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

🐾 那如果是a~b之间的随机数呢?

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

🐶 🐾 ✨ 🐾 🐶


5、猜数字游戏

🐾 结合所学的知识,我们来创建一个小游戏吧!

#include<stdio.h>#include<stdlib.h>#include<time.h>voidmenu(){printf("*******************\n");printf("****** 1.play *****\n");printf("****** 0.exit *****\n");printf("*******************\n");}voidgame(){intr=rand()%100+1;//随机生成1~100之间的数字intguess=0;while(1){printf("请输入一个数字:");scanf("%d",&guess);if(guess>r){printf("猜大了\n");}elseif(guess<r){printf("猜小了\n");}else{printf("猜对了,好厉害\n");break;}}}intmain(){intinput=0;srand((unsignedint)time(NULL));do{menu();printf("请选择:");scanf("%d",&input);switch(input){case1:game();break;case0:printf("游戏结束\n");break;default:printf("选择错误,请重新选择\n");break;}}while(input);return0;}

🐾 运行结果:

🐶 🐾 ✨ 🐾 🐶


🐾 为了增加游戏难度,我们还可以设置猜数字的次数限制,如果5次还未能猜出来,则挑战失败!

#include<stdio.h>#include<stdlib.h>#include<time.h>voidmenu(){printf("*******************\n");printf("****** 1.play *****\n");printf("****** 0.exit *****\n");printf("*******************\n");}voidgame(){intr=rand()%100+1;//随机生成1~100之间的数字intguess=0;intcount=5;while(count){printf("你还剩%d次机会\n",count);printf("请输入一个数字:");scanf("%d",&guess);if(guess>r){printf("猜大了\n");}elseif(guess<r){printf("猜小了\n");}else{printf("猜对了,好厉害\n");break;}count--;}if(count==0){printf("次数用完,挑战失败,正确值是: % d\n",r);}}intmain(){intinput=0;srand((unsignedint)time(NULL));do{menu();printf("请选择:");scanf("%d",&input);switch(input){case1:game();break;case0:printf("游戏结束\n");break;default:printf("选择错误,请重新选择\n");break;}}while(input);return0;}

🐾 运行结果:


举爪爪!你已经看完这篇啦~

不关注一下吗?我会偷偷开心一整天的😉

👍 点赞 ⭐ 收藏 💬 评论

http://www.zskr.cn/news/1352686.html

相关文章:

  • 为什么选择Junior?探索这款HTML5移动应用框架的独特优势
  • 如何用Material Motion Swift快速创建10种炫酷动画效果
  • TradingAgents-CN终极指南:如何用多智能体AI构建专业股票分析平台
  • 《流浪地球2》最耐看的不是大场面!梁練偉解读3条隐藏暗线
  • AI生成论文的查重率区间是多少?目前控制AIGC疑似率最好用的软件有哪些?
  • 测试工程师如何与开发人员高效沟通?这5个技巧让你不再背锅
  • kss-node与Sass/LESS集成实战:提升前端开发效率的终极指南
  • 3种常见光谱仪实验的Open Spectrometer Python实现方案
  • 5个理由让你立即尝试ImStudio:实时GUI布局设计器
  • AT89C2051模拟比较器调试与实战应用
  • Windows 11系统性能优化方案:通过Win11Debloat工具提升系统响应速度的3个关键步骤
  • sdk-manager-plugin历史与演进:从诞生到废弃的完整技术演进路线图
  • 掌握Manim数学动画引擎:从零到一的完整攻略
  • 当99%的作业都是AI写的,大学还剩什么?这届“AI原住民”毕业生的答案亮了!
  • Pocket Sync:一站式终极Analogue Pocket管理工具,告别繁琐操作烦恼
  • JDeferred高级技巧:多Promise管理、竞态条件和错误处理
  • Keil MDK 5中RL-TCPnet的兼容性与配置指南
  • Vue3——defineOptions和defineModel
  • UI-TARS桌面版完整指南:零代码实现智能GUI自动化
  • Vanna AI终极指南:如何用自然语言轻松查询数据库
  • 专业级多平台数据采集系统:架构设计与性能优化实战
  • 探索openpilot:开源自动驾驶系统的核心架构与实战指南
  • 线上监控怎么搭:业务指标+模型指标+工具指标的一体化看板
  • 韩国科学技术院研究团队提出的全新推理蒸馏框架CoRD
  • SillyTavern终极指南:3步搭建你的AI聊天室,轻松管理所有AI模型
  • Balena Etcher:3步搞定镜像烧录,告别传统工具烦恼
  • EasyHook终极指南:在64位Windows上实现跨架构API钩子的完整解决方案
  • C51单片机printf重定向到第二串口(SIO1)的实现方法
  • AI与操作系统融合:从组件优化到架构演进的技术实践
  • AI INFRA之NVIDIA GPUDirect节点内和节点间通信原理详解