第4讲:分支与循环(下)

本文介绍了如何在C++中使用rand和srand函数生成1~100的随机数,控制随机数范围,并利用time函数设置种子以确保每次运行生成不同的随机数,用于编写一个猜数字游戏。
摘要由CSDN通过智能技术生成

写一个猜数字小游戏:

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

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

INUYACHA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值