首页 > 编程语言 >《程序是怎样跑起来的》·第十二章 让计算机"思考"

《程序是怎样跑起来的》·第十二章 让计算机"思考"

时间:2023-02-21 00:55:28浏览次数:32  
标签:12 思考 程序 第十二章 石头 随机数 出拳 计算机

阅读正文前,让我们先回答下面的问题来热热身吧。

  1. 用计算机进行的模拟试验称为什么?
  2. 伪随机数指的是什么?
  3. 随机数的种子指的什么?
  4. 计算机有思考功能吗?
  5. 计算机有记忆功能吗?
  6. AI是什么的缩写?

答案:

  1. 计算机模拟
  2. 通过公式产生的伪随机数
  3. 生成伪随机数的公式中使用的参数
  4. 没有
  5. 工智能

1 作为"工具"的程序和为了"思考"的程序

程序就如同是由计算机执行的各种指令罗列起来的文章。计算机内部的CPU,通过对该文章的内容进行解析和运行,来控制连接到计算机的各种外围设备。具体来说,控制就是指CPU和各种设备之间配合进行数据的输入输出处理。关于程序的运行原理,在前面章节中我们已经从各方面进行了说明。那么,如果此时再问大家“使用程序的目的是什么”,各位会如何回答呢?
程序的使用目的大体可以划分为两类。一类是大家作为工具来使用的程序。例如,文字处理器这个程序,大家是将其作为文档处理的工具来使用的。虽然用笔及尺子等也可以作成文档,不过用文字处理器会更有效率。这种情况可以说是程序替代了现有的工具。
另外一个使用目的是用程序来代替执行人类的思考过程。例如,微计算机 控制的电饭煲,会根据米和水的份量来自动调整火的大小以及加热时间,进而焖出好吃的米饭。当然,大家只要控制好火的大小及加热时间,也可以做出好吃的米饭。不过,这件事由计算机代替执行了。这种情况就可以说是借助程序,使计算机有了“思考”功能(图12-1)。

2 用程序来表示人类的思考方式

 接下来让我们对代码清单12-1的内容进行说明。computer是用来保存计算机出拳数据的变量。石头、剪刀、布分别用数值0、1、2来表示(后面的程序中也是如此)。这里使用随机数来决定是0、1、2中的某一个数值。随机数指的是随机出现的没有规律的数值。在C语言中,rand(函数返回的随机数的范围是0~32767。该值用3来取余,得到0、1、2中的某一个数值。用该值作为计算机的出拳数据。也就是computer=rand) %3;这一部分。其中,%是取余运算符。而至于rand()前面的 srand(time(NULL));的功能,我们会在后面进行说明。

该程序运行后,首先出现的是“石头剪刀……”。这个时候请大家在头脑中想定一个自己要出的拳。想好自己要出的拳后,按下Enter键。等到画面中出现了“布!”,计算机的出拳信息也就显示出来了。if..else if.. else这一部分表示的是,根据变量computer中所代入的数值(0、1、2)的不同,计算机的出拳信息分别以“石头”“剪刀”“布”的形式显示在画面上。程序的运行结果如图12-3所示。

 

 用随机数决定出拳的方式,同随意而定的思考方式是相同的。表12-1是该程序运行10次时计算机的出拳信息。

通常所说的随机数指的是统一随机数。统一随机数指的是在一定数值范围内各数出现频率相同的随机数形式。C语言中的rand()函数的返回值就是统一随机数。

3 用程序来表示人类的思考习惯

即使是成年人,可能偶尔也会像代码清单12-1这样猜拳时随意决定出什么。不过,并不是所有人都如此。例如,"小一个同学喜欢出石头",像这样,出拳习惯是因人而异的。习惯也是人类的思考方式。而如果要用程序来表示人类的习惯,就需要对习惯进行定量表现。虽然这里提到了定量,但大家不要想得太复杂。出石头的概率是50%,出剪刀的概率是30%,出布的概率是20%,像这样用数值来表示的方式,就是定量的意思。下面就让我们来生成一个具有习惯的程序。在代码清单12-1中,我们使用了0、1、2这3个随机数来表示石头、剪刀、布。这里,我们用0~9这10个随机数,0~4时表示石头,5~7表示剪刀,8~9表示布,这样规定后,石头、剪刀、布的百分比率就分别变成了50%、30%、20%。该程序只要把先前的程序稍微改造一下即可实现。把决定计算机出拳的计算机=兰德() %3;部分变成计算机=兰德() %10;,计算机变量就可以得到0~9的随机数了。然后,再将如果...否则如果...还这一部分改造为,变量计算机的值是0~4时显示"石头"、为5~7时显示"剪刀"、为8~9时显示"布"。通过这些变化,石头剪刀布出现的几率就分别成50%、30%、20%了(代码清单12-2)。

 这样,具有某种习惯的猜拳游戏就完成了。让我们把程序运行一下看看(表12-2)。相比前面的程序,该程序的出拳方式更类似于人类的习惯。多次猜拳后,就会发现"这个计算机有出石头的习惯"。不过,真正的计算机并不具有习惯。这里只是运行了具有的习惯的程序而已。

4 程序生成随机数的方法

接下来,让我们看一下随机数在程序中扮演的角色。在编写游戏程序时,以及在计算机模拟一个等情况下,经常使用随机数。随机数也是用程序来表示人类的直觉及念头的一种方法。从代码清单12-2的运行结果中大家可以发现,"一直在出石头的时候突然出了一个剪刀",这确实很像人类的行为方式。

随机数色子B是用来产生随机数的一种工具,每个色子有20面。晃动随机数色子后,出现在正面的数字就是随机数。由于计算机没法晃动随机数色子,因此程序一般会通过生成类似于随机数的数值公式来得到随机数。在C语言中,虽然该公式的实体是隐藏的,但只要调用兰德()函数,就可以得到结果(随机数)。不过,由于借助公式产生的随机数具有一定的规律性,因此并不是真正的随机数,通常称为伪随机数。不过,虽然是伪随机数,仍然十分有用。

作为参考,这里向大家介绍一个获取伪随机数的公式。该公式称为线性同余法C。如果把日作为当前随机数的话,那么下一个出现的随机数R我+ 1就可以用下面的公式来获取。R我+ 1=(a×Ri+b) 模组c

公式中出现的MOD,是整除后取余的意思。同C语言的%运算符的功能是一样的。对一个、b、c各参数设定合适的整数后,可以从该公式获得的随机数的范围就是0到c(不包含)。因为是用c来进行取余,所以得到这个范围也是理所当然的。我们不妨做一下尝试,把一个设定为5,b设定为3,c设定为8,获得的随机数就如表12-3所示。这里把日的初始值定为了1。可以看出,这些随机数确实很像是无规则随机出现的数值。不过,产生8次随机数后,下8次产生的随机数就和前面的数值相同了。这种周期性是伪随机数的特征,也是为什么不是真随机数的原因。C语言的润德()函数中,也肯定通过某些公式生成了伪随机数。假如使用的是线性同余法的话,就需要提前设定日、一个、b、c的数值,为此就要用到代码清单12-1及代码清单12-2中的srand(time(NULL));。斯兰德()函数中的参数时间(空),是用来获取当前时间的参数。以时间(空)的值为基础,来设定日、一个、b、c的数值。由于每次启动程序时的当前时间都是变化的,因此日、一个、b、c的数值也会随之发生变化。日、一个、b、c的数值就称为随机数的种子,这一点大家要有个印象。而假如在不运行srand(time(NULL));的情况下重复调用兰德()函数的话,会出现什么情况呢?因为日、一个、b、c的数值都有默认值,因此每次都会生成以相同方式出现的随机数。这样一来,游戏以及计算机模拟就都无法成立了。当然也就无法表示人类的思考了。

 

 

5 活用记忆功能以达到更接近人类的判断

人类的日常判断通常是根据直觉和经验做出的。直觉并不仅仅是简单的任意思考,通常还带有一些个人的思维习惯。在前面的介绍中我们已经提到,通过借助随机数,思考习惯等也是可以表示的。而如果在此基础上再加上经验(记忆)元素的话,想必就可以作成更接近人类思考的程序了。请大家考虑一下猜拳游戏中是如何用到经验的。经过多次猜拳后,我们可能就会得到类似于"小B同学在出石头后出剪刀的概率比较高"这样的经验。基于这一经验,我们就可以应用以下策略,即"刚才小B同学出了一个石头,接下来应该会出剪刀,因此计算机出石头的话就赢了"。代码清单12-3是实现该策略的程序示例。在该程序中,通过键盘输入0、1、2来决定出拳。当键盘输入0、1、2以外的数值时,结束游戏。

 

 在该程序中,猜拳结果被保存在了计算机内部的内存中。而对手的出拳信息也通过2维数组一个记录了下来。例如玩家[0][0]这个数组元素记录的就是对手出石头后再出石头的次数。数组的索引0、1、2分别表示石头、剪刀、布。由于猜拳游戏刚开始时,数据记录还不够充足,因此这里使用了变量计数器来记录猜拳的次数,当不满10次时,由随机数来决定出拳。变量昨日记录的是对手先前的出拳信息。运行代码清单12-3的程序后,就会发现计算机变强了(图12-4)。表12-4表示的是对手连续出了15次石头时计算机的出拳信息。借助记忆功能,在猜拳游戏进行了10次以后,计算机出的都是布,全胜。这是因为计算机基于"对手出石头后还会出石头"这一记忆,做出了出布的判断。

 

 单纯就记忆能力来说,计算机要比人类强大得多。因此,只要对程序进行一些改造,使计算机记住"对手出石头获胜后接下来会出剪刀,出石头输了后接下来会出布"这些细节信息的话,计算机就会更加擅长猜拳游戏了。不过,如果太过于强大的话,可能又会不像人类的思考方式了。

6 用程序来表示人类的思考方式

到目前为止,我们已经用程序表示了直觉、想法、习惯以及经验等。不过,除此之外,人类还有一个思考方式。思考方式是思考方法的节奏。人类大脑中有类似于"石头、石头、布、剪刀"或"剪刀、石头、石头、布"这种具有节奏感的短语,人类会在此基础上做出判断,这就是思考方式。

代码清单12-4是用程序来实现思考方式的示例。这里用2维数组PTTERN[2][4]来表示"石头、石头、布、剪刀"及"剪刀、石头、石头、布"这两种思考方式。人类会在不知不觉中按照自己的思考方式出拳,但连续输掉多次后也会变换一些方式。在该程序中,我们将其设定为连续输两次就改变思考方式。在时赢时输的情况下,则按照节奏以同一种方式出拳。

 

 运行该程序后,大家可能就会察觉到"该计算机有自己的出拳方式"。在至今为止我们所介绍的程序中,该示例程序可能最接近人类的思考方式。大 家 应 该 都 听 过 人 工 智 能(.AI,人工智能)这 个 术语。人工智能是用计算机来实现人类智能的尝试。从计算机诞生之初的1950年代开始,关于人工智能的研究就层出不穷,到现在已经有了大量成果。本章介绍的《猜拳游戏》,虽然只是涉及了一点皮毛,但也可以说是人工智能。不过,计算机本身并不智能,它只是运行了表现人类思考方式的程序而已。也就是说,开发程序的程序员,赋予了计算机这些智能。程序只是将人类的想法在计算机上进行了重现。想到这些,是不是感觉很愉悦呢?

 

 

 

 

标签:12,思考,程序,第十二章,石头,随机数,出拳,计算机
From: https://www.cnblogs.com/Chenyaxuan/p/17139518.html

相关文章