0
点赞
收藏
分享

微信扫一扫

网安培训第二期——sql注入+中间件+工具

小磊z 2024-01-27 阅读 9

写一个猜数字小游戏:

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;
}

举报

相关推荐

0 条评论