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

发布时间:2026/5/23 4:37:17

【C语言】一文吃透C语言分支循环中的rand、srand与time函数 相关专栏【Linux专栏】【C语言专栏】【测试专栏】【MySQL专栏】 相关文章推荐【Linux】Socket编程UDP【Linux专栏】【C语言专栏】【测试专栏】很高兴你点开这篇文章✨这里会持续更新我喜欢的内容关注我一起慢慢变好呀 点赞 ⭐ 收藏 评论文章目录前言1、rand2、srand3、time4、随机数范围的设置5、猜数字游戏前言在C语言的学习路上分支与循环是构建程序逻辑的基础而随机数生成则是很多趣味项目比如猜数字、小游戏的核心功能。很多刚接触C语言的同学在第一次使用 rand() 函数时都会遇到一个共同的问题为什么每次运行程序生成的“随机数”都是一样的这篇文章就来帮你彻底搞懂 rand() 、 srand() 和 time() 这三个函数的底层逻辑与正确用法结合分支与循环的知识点带你从“只会调用函数”到“真正理解随机数的生成原理”解决新手最容易踩的坑。1、randrand用来生成随机数的intrand(void);rand函数会返回一个伪随机数这个随机数的范围是在0~RAND_MAX之间这个RAND_MAX的大小是依赖编译器上实现的但是大部分编译器是32767。 它的头文件是 stdlb.h我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的但是下⼀次运⾏程序⽣成的结果和上⼀次⼀模⼀样这就说明有点问题。如果再深⼊了解⼀下我们就不难发现其实rand函数⽣成的随机数是伪随机的伪随机数不是真正的随机数是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的那是因为rand函数⽣成随机数的默认种⼦是1。如果要⽣成不同的随机数就要让种⼦是变化的。 ✨ 2、srandsrand是用来初始化随机数的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()%1001//%100的余数是0~99,0~99的数字1,范围是1~100 那100~200呢rand()%(200-1001)//余数的范围是0~100加100后就是100~200 那如果是a~b之间的随机数呢arand()%(b-a1) ✨ 5、猜数字游戏 结合所学的知识我们来创建一个小游戏吧#includestdio.h#includestdlib.h#includetime.hvoidmenu(){printf(*******************\n);printf(****** 1.play *****\n);printf(****** 0.exit *****\n);printf(*******************\n);}voidgame(){intrrand()%1001;//随机生成1~100之间的数字intguess0;while(1){printf(请输入一个数字);scanf(%d,guess);if(guessr){printf(猜大了\n);}elseif(guessr){printf(猜小了\n);}else{printf(猜对了好厉害\n);break;}}}intmain(){intinput0;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次还未能猜出来则挑战失败#includestdio.h#includestdlib.h#includetime.hvoidmenu(){printf(*******************\n);printf(****** 1.play *****\n);printf(****** 0.exit *****\n);printf(*******************\n);}voidgame(){intrrand()%1001;//随机生成1~100之间的数字intguess0;intcount5;while(count){printf(你还剩%d次机会\n,count);printf(请输入一个数字);scanf(%d,guess);if(guessr){printf(猜大了\n);}elseif(guessr){printf(猜小了\n);}else{printf(猜对了好厉害\n);break;}count--;}if(count0){printf(次数用完挑战失败正确值是 % d\n,r);}}intmain(){intinput0;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;} 运行结果举爪爪你已经看完这篇啦~不关注一下吗我会偷偷开心一整天的 点赞 ⭐ 收藏 评论

相关新闻