1. 随机数⽣成 要想完成猜数字游戏,⾸先得产⽣随机数,那怎么产⽣随机数呢?
1.1 rand C语⾔提供了⼀个函数叫 rand,
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是 依赖编译器上实现的,但是⼤部分编译器上是32767。
rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h
那我们就测试⼀下rand函数,这⾥多调⽤⼏次,产⽣5个随机数:
我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的,但是下⼀次运⾏程序⽣成的结果和上⼀次 ⼀模⼀样,这就说明有点问题。
如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正 的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函 数是对⼀个叫“种⼦”的基准值进⾏运算⽣成的随机数。
1.2 srand
C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的
程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
1.3 time
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。 在C语⾔中有⼀个函数叫 time ,就可以获得这个时间
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类 型。
如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。 time函数的时候需要包含头⽂件:time.h
如果只是让time函数返回时间戳,我们就可以这样写:
time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值
1.4 设置随机数的范围
如果我们要⽣成0~99之间的随机数,⽅法如下:
rand() %100;//余数的范围是0~99
所以如果要⽣成a~b的随机数,⽅法如下:
a + rand()%(b-a+1)
数字游戏
构造前夕
由于前面的printf会自动打印,故每次输入前都会显示
而且一次结束后自动填充;图片中说明在whlie已经运行了多次,仅仅跳出switch循环,如果input=0;即跳出do whlie循环,程序结束
如果看见多个printf打印函数比较烦,影响代码美观,可以用函数进行调用
故随机数字运用
头文件和打印的menu没截取了;接下来是运行程序,会发现值非常接近,已经出现相等;
那么怎么解决,将srand放在主函数里面,在对猜数字游戏进行改进,基本实现
此时这种,input=1;进入case1;在game建立一个循环,进行猜字游戏,成功后break跳出循环
猜数字游戏的基本实现
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void menu()
{
printf("**********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("**********************\n");
}
void game()
{
int ret = rand() % 100 + 1;
int guess = 0;
while (1)
{
printf("请输入数字nmmnmn ");
scanf_s("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:> ");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输错了,再试一次\n");
break;
}
} while (input);
return 0;
}
那假如加入限制,如果game输入n次跳出
切记,while里应该是和count一样,等于0;即退出循环,如果常数不然会一直循环