【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
可见,打印出来的随机值都不一样。
🐶 🐾 ✨ 🐾 🐶
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;}🐾 运行结果:
举爪爪!你已经看完这篇啦~
不关注一下吗?我会偷偷开心一整天的😉
👍 点赞 ⭐ 收藏 💬 评论
