这里写目录标题
一、基本知识
1、随机数生成
【1】rand函数
.在C语言中,rand函数是一个用于生成随机数的标准库函数,该函数声明和定义位于头文件stdlib.h中,该函数原型为:
int rand (void);
用以下代码进行测试:
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
运行结果如下(多运行几次):
可以发现,每次结果是一样的。
这是因为:rand函数生成的随机数是伪随机数,即将基准值通过某种算法生成的随机数,这个基准值可以称为“种子”。并且rand函数默认“种子”为1。
【2】srand函数
为了生成不同的随机数,就要让“种子”变化,这就需要srand函数,该函数头文件也为stdlib.h
函数原型如下:
void srand(unsigned int seed);
srand函数也是C语言提供的库函数,用来初始化随机数的生成器,在使用rand之前先调用srand函数,通过srand函数的参数seed来设置“种子”,只要seed变化,随机数序列就会变化。换句话说,srand函数设置了随机数的生成起点。
需要注意的是:srand函数在猜数字游戏这个程序中调用一次就够了,无需频繁调用。
测试如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(2);//seed为2
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
改变seed:
#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(6);//这里seed改为6
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
可以看出两次结果不同,但如何让seed自行改变,而非一个固定值呢?这时候就需要time函数。
【3】time函数
我们可以将时间作为seed,因为时间时刻变化。
头文件:time.h
原型:
time_t time(time_t* timer);
这里我们引入一个新的概念:时间戳。
计算机起始时间和当前时间的差值,换算成秒,就是时间戳。
当timer为NULL时,就返回这个差值,也就是时间戳。
这样,代码就可以写为:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(NULL));
//srand函数返回值类型为unsigned int,所以需要强制类型转换
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
运行多次,结果不同:
2、设置随机数的范围
【1】实现0~99之间的随机数
rand()%100;//余数范围0~99
【2】实现1~100之间的随机数
rand()%100+1;//余数范围0~99,再加1
【3】实现100~200之间的随机数
100+rand()%(200-100+1);
【4】实现a~b之间的随机数
a+rand()%(b-a+1);
二、代码实现
1、设计要求
【1】电脑自动生成1~100随机数
【2】玩家猜数字,猜数字过程中,根据猜测数字大小,电脑给出反馈
【3】限定10次以内猜对,否则失败
2、设计思路
1、为了美化,先设计一个菜单,选择是否开始游戏
2、用循环实现一场游戏结束后是否选择开始下一场游戏
3、用自定义函数编写游戏过程,使代码看起来更清晰
4、记得提醒玩家剩余猜数字的次数
3、最终呈现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()//生成随机数+猜数字
{
int num=rand() % 100 + 1;
int guess = 0;
int count = 10;
while (count)
{
printf("你还有%d次机会",count);
printf("请猜数字:");
scanf("%d",&guess);
if (guess > num)
{
printf("猜大了\n");
}
else if (guess < num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
count--;
}
if (count == 0)
{
printf("你失败了,正确答案是:%d\n", num);
}
}
void menu()//菜单
{
printf("****************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("****************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//只调用一次srand
do
{
menu();
printf("请选择:\n");
scanf("%d",&input);//选择是否进入游戏
switch (input)
{
case 1:
game();//调用执行游戏过程的自定义函数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
//该循环实现一次游戏结束后下一场游戏的选择
return 0;
}
运行结果:
如有问题,欢迎指正!