C语言之生成随机数方法(C代码实现猜数字游戏)
首先先把猜数字游戏的代码给大家暂时出来,然后我们在根据代码的步骤一步一步的推导
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//
//void menu()
//{
// printf("***************************\n");
// printf("***** 1.play 0.exit *****\n");
// printf("***************************\n");
//}
//
void srand (unsigned int seed);
//void game()
//{
// RAND_MAX;
// //1. 生成随机数
// int ret = rand() % 100 + 1;//可以生成随机数,随机数的范围是:0~32767
// //0~99
// //2. 猜数字
// int guess = 0;
//
// while (1)
// {
// printf("请猜数字:>");
// scanf("%d", &guess);
// if (guess > ret)
// {
// printf("猜大了\n");
// }
// else if (guess < ret)
// {
// printf("猜小了\n");
// }
// else
// {
// printf("恭喜你,猜对了\n");
// break;
// }
// }
//}
//
//int main()
//{
// //打印菜单
// //1. 玩游戏
// //0. 退出游戏
// int input = 0;
// srand((unsigned int)time(NULL));//要给srand传递一个变化的值,计算机上的时间是时刻发生变化的
// //time函数可以返回一个时间戳
// do
// {
// menu();
// printf("请选择:>");
// scanf("%d", &input);//1 0
// switch (input)
// {
// case 1:
// game();
// break;
// case 0:
// printf("退出游戏\n");
// break;
// default:
// printf("选择错误\n");
// break;
// }
// } while (input);
//
// return 0;
//}
//
这是我们猜数字游戏的一般思路
首先我们打印一个菜单,选择1就玩游戏,选择0就退出游戏,既不选择1也不选择0,那我们就走到default语句,首先我们的do-while循环一进来,最后的while(input)为0循环就终止,所以大家要搞清楚这里的do-while循环的基本逻辑,我们在switch语句里面加入break的原因是遇到break就停止switch里面的循环,do-while循环只要你不选择0就会一直进行,大家思考一下是不是这个道理如果我们选择case1:,那么如果我们这里输出printf(“开始游戏”)的话,你会发现你好像并不能真正的开始游戏,只能看到一段文字打印在屏幕上,这时我能想一下函数的调用这个知识点,一旦我们选择case1:,我们就进入到game()函数内部正式开始我们的游戏,设置一个随机数,电脑自动生成大小(范围我们在讲完time函数之后会给大家讲解),然后我们输入数字,再设置一个循环,这个时候我们就可以进行猜测,猜对了就退出循环,又再次进入到main函数再次开始我们的do-while循环,这就是我们的猜数字游戏C代码的基本逻辑,好,下面给大家把代码拆分开来讲解一下一些生成随机数的函数的用法以及time.h头文件
rand函数
我们来看一看rand函数的用法
rand函数
这里给大家分析一下,这里的参数为void(空),返回类型为Int ,return一个伪随机的整数在0到RAND_MAX
有同学就有疑问了,这个RAND_MAX是个什么东西,那我带着大家来看一看
RAND_MAX介绍
我们可以看到RAND_MAX表示的最大数为32767,所以RAND_MAX表示的范围为0-----32767
srand函数
srand函数
这里有个C语言的语法规定,就是在设置rand函数之前必须设置一个srand函数,这是C语言语法规定的
我们这里需要引入一个概念—时间戳,我们来解读一下时间戳的概念
时间戳:当前的时间点和计算机的起始时间(1970年1月1日0时0分)的差值,单位为秒的数字就叫时间戳,那这个时间戳是怎么产生的呢,这里就需要引入一下time函数,大家可能不太了解time函数,我们还是给大家来讲解一下
通常我们使用时间作为随机数生成的种子,因为每次程序运行时间不相同,所以生成的随机数也肯定不相同
好的,大家从time函数那儿回到srand函数这里来
我们来看srand函数的参数,无符号的整型我们就可以写成下面代码
srand((unsigned int)time(NULL));//要给srand传递一个变化的值,计算机上的时间是时刻发生变化的
**```
time函数的参数你不想传任何值,就把他置成空(NULL)
在我们的工程或者项目里面(srand函数执行一次就可以了),我们总不能每玩一次游戏都要设置一个随机数生成的起点吧,所以只有在我们的主函数main当中srand函数就执行一次**
# time函数
[time函数](https://legacy.cplusplus.com/reference/ctime/time/?kw=time)
**![在这里插入图片描述](https://img-blog.csdnimg.cn/3a0ce68fc66c48198178c835e3995107.png)
**time函数的参数是一个指针,如果你不想传任何值,你可以将它置成NULL(空)
time函数可以随机产生一个时间戳****
# 生成随机数范围公式
**现在我们想生成一个1-100的数字我们想一下应该怎么生成呢???
一个数字除以100取模取出来的是0-99的数字,现在我们想生成1-100的数字,我们加一就可以了,我们看一下具体的代码**
```cpp
int ret = rand() % 100 + 1;//可以生成随机数,随机数的范围是:0~32767
//0~99
这样就可以表示1到100的数字了,希望大家能够理解
v1 = rand() % 100; // v1 in the range 0 to 99
v2 = rand() % 100 + 1; // v2 in the range 1 to 100
v3 = rand() % 30 + 1985; // v3 in the range 1985-2014
srand((unsigned int)time(NULL));
int ret1 = rand() % 10 + 1;//生成1~10的随机数
int ret2 = rand() % 100 + 1;//生成1~100的随机数
int ret3 = rand() % 34 + 66;//生成66~99的随机数
int ret4 = rand() % (n - m + 1) + m;//生成m~n的随机数
总结
我们将代码运行起来给大家切身体会一下
这就是猜数字游戏C代码的运行结果,感觉还是比较容易理解,几个比较难的函数(rand/srand/time),我也一一给大家讲解了,本章的重点就在于这几个函数,其实srand函数就是遵循C语言的一般语法形式,你直接这样写就好了,以后遇到这类函数就能迎刃而解了
本章终!