课程首页 › 第3部分 › 第56课

第56课 骰子电子屏

第3部分 不辞辛苦 · 循环结构· 知识点:for循环、随机数

骰子电子屏(for循环、随机数)

插图

摇骰子

插图

运行程序,闪烁一会后:

?4?

插图

体验完程序后,找找代码中的新知识,我们一起来研究。

(1)发现一些新的头文件:

#include
#include

(2)新知识srand(time(NULL))。

(3)新知识int num=rand()%6 + 1。

来吧,我们一个个攻克。

(1)关于头文件,我们知道它是为了让程序使用什么而导入的,所以一定和后面的两个新知识有关,这里暂且放一放。

(2)关于程序新知识,我们不妨运用之前学习的翻译助力理解的方法试一试。

翻译助力理解

●srand:随机数发生器的初始化函数。

●time:时间。

●rand:是random的简写,表示随机的。

大致理解如下:

int num=rand()%6 + 1,从=可知是将得到的一个数赋值给了num,而这个数大概和随机数有关。前面还有一句srand(time(NULL)),从翻译来看,它是在随机数初始化的时候起作用,所以也写在了随机数之前。

再回到头文件,想要知道头文件对应哪个函数,可以试着删除引用的头文件,然后观察哪行代码报错,于是就能知道它们之间的对应关系。

划重点——知识大爆炸

就算我们可以通过搜索引擎或者书籍快速获取知识,也不要忽视探索知识的过程,因为那是一种从未知中寻找答案的宝贵经历。面对未知时,不妨先进行探索。

未来,我们去想象、创作和创造都会面对未知,因此探索未知的能力比快速记忆知识更为重要。

rand()是一个用于产生随机数的函数,可以理解成一个功能,有了它就可以产生随机数。然而,计算机的运行过程是确定的,这个确定的过程不可能产生真正意义上的随机数字,因此纯软件方式只能产生伪随机数。注意:计算机可以通过特殊的硬件设备来捕捉一些物理过程,并将其转换为真正的随机数。例如计算机可以通过芯片的电子噪声产生真随机数。这种方法称为硬件随机数发生器(HRNG),利用芯片中微小电子元件的热噪声、放置噪声或其他量子效应来生成真随机数。

提出思考

怎么理解伪随机呢?我们看两段程序:

(1)多次运行程序输出随机数:

插图

运行这段程序10次,结果都是41(不要纠结是不是41,而要关注每次运行输出的随机数都是同一个数)。

(2)多次运行程序输出随机数列:

插图

每次运行都输出了固定的数列:

插图

伪随机:当产生一个序列之后,只要不更新这个序列,每调用一次rand(),就会在这个序列中从上到下依次取值。这就是为什么如果只运行一次rand(),结果永远是41,因为按顺序取的都是第一个数。

如果我们在使用rand()之前,通过srand(seed),生成一个全新的序列,就可以解决这个问题了。需要让srand(seed)中的seed(种子数)不停地改变,从而产生新的序列。因为系统的时间是不断变化的,所以使用了时间。程序中获取时间是time(NULL),将它们组合起来就是srand(time(NULL))。

插图

提出思考

time(NULL)获取的时间长什么样子呢?

想知道,就输出看一看。

插图

运行程序:

插图

提出思考

骰子一共只有6个点,随机数怎么控制呢?

插图

用求余法可以很好地解决。一个数除以6余数是0、1、2、3、4、5,再加1就变成1~6。所以int num=rand()%6 + 1。

总结一个公式,取minValue~maxValue之间的随机数:number=(rand()%(maxValue - minValue +1))+ minValue。

敲黑板

不是所有相同的操作都必须使用循环结构,更不是所有的重复都要嵌套循环。关键在于程序采用循环结构是否更为便利,是否更便于阅读。如果不使用循环结构而程序更清晰明了,那么程序不用循环结构反而更好。

插图

巩固练习

(1)想要随机获取1月份中的日期,请问用以下哪段程序可以实现?()

A.rand()/31+1

B.rand()%30+1

C.rand()%31+1

D.srand()%31+1

(2)输出10个1~10的随机数,请问srand(time(NULL));应该放在①的位置还是②的位置。()

#include
#include
#include
using namespace std;
int main(){

①srand(time(NULL)); for(int i=0;i<10;i++){

②srand(time(NULL)); int num=rand()%10 + 1; cout<<num<<endl;}

return 0;}

A.①

B.②

(3)随机产生两个0~9的数字,并显示例如“6*5=”的乘法计算题。答题者输入答案,如果答案正确,则打印“太棒了!”,如果回答错误,则打印“不对,加油!”,然后继续出题。

示例:

3*0=0

太棒了!

8*8=64

太棒了!

2*2=4

太棒了!

7*1=5

不对,加油!

7*5=35