写一个猜数字小游戏:
1.生成一个1~100的随机数
2.玩家猜数字,反馈猜的情况,输出猜的数字比随机数大还是比随机数小,直到猜出随机数为止
1.如何生成随机数
1.1rand函数
函数功能:生成伪随机数
参数:无
返回值:返回值类型是整型,返回值是生成的伪随机数
头文件:stdlib.h
问题:我们该如何控制随机数的范围
设有a,b,c,d四个整数
它们满足a / b = c,余数是d
我们知道,d一定是小于b的。
举例,一个数字除以100,他的余数可能是100吗,可能比100大吗?
显然,不可能。
所以,d的范围是0~99
有了这个原理,我们就能控制随机数的范围
如果要表示从a~b的随机数
只需:rand()%(b-a+1)+a
一个随机数除以(b-a+1)的余数范围是0~(b-a),加上a,范围就变成了a~b
现在我们用循环生成5个随机数
好,成功了
但是啊,只要多运行几次就能发现一个问题:
每次生成的结果都一样啊,为什么呢?
因为rand是根据“种子”通过一种算法进行随机数的生成
如果不设置种子,那么种子默认为1,就会出现这个情况。
那么该怎么解决呢?
其实很简单,我们只需要在每次运行时,生成一个不一样的数字,将其设置为种子就可以了。
但是啊,说的很简单,但是做起来难啊!
我们的目的就是生成一个随机数,现在为了实现这个目的,需要生成一个随机数,互相矛盾了。
怎么办呢?
其实,我们只需要在每次运行的时候生成一个不一样的数字就可以了。
而我们每次运行的时间(这里的时间是指某一确定的时间到现在所经过的秒数)是不可能相同的。
1.2time函数
参数:参数类型是指针类型,参数是指针
功能:当参数不为空指针时,将1970年1月1日0时0分到现在所经过的秒数输入到指针(参数)所指向的那个空间,当参数为空指针时,什么也不做。
返回值:返回值类型是time_t,返回值是1970年1月1日0时0分到现在所经过的秒数。
头文件:time.h
现在,我们只需要使time函数返回这个值就可以了,不需要time的功能,所以,这不超纲,参数写个NULL就行了。
现在,我们来了解一下如何设置种子。
1.3:srand函数
功能:设置种子
参数:参数类型是unsigned int,参数是种子
返回值:无
头文件:stdlib.h
但是,这种写法有点不好,因为time的返回值类型是time_t,srand函数的参数类型是unsigned int,这不太好,需要类型强转才比较合适
好,现在基础知识已经讲完了,请大家自行实现该代码,下面是参考答案。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int input;
srand((unsigned int)time(NULL));
int num = rand() % 100 + 1;
do
{
scanf("%d", &input);
if (input < num)
printf("小了\n");
if (input > num)
printf("大了\n");
} while (input != num);
printf("you win\n");
return 0;
}