博客为参考《程序是怎样跑起来的》一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.作为“工具”的程序和为了“思考”的程序
👉第12章热身问答:
- 用计算机进行的模拟试验称为什么?
- 计算机模拟。计算机模拟是指用软件来进行实际试验。
- 伪随机数指的是什么?
- 通过公式产生的伪随机数。伪随机数同真正的随机数不同,具有周期性。
- 随机数的种子指的什么?
- 生成伪随机数的公式中使用的参数。随机数的种子不同,产生的随机数也是不同的。
- 计算机有思考功能吗?
- 没有。作为计算机大脑的CPU,其本身并不具有思考功能。
- 计算机有记忆功能吗?
- 有。内存及磁盘等有记忆功能。
- AI是什么的缩写?
- Artificial Intelligence。Artificial Intelligence是“人工智能”的意思。
程序就如同是由计算机执行的各种指令罗列起来的文章。计算机内部的CPU,通过对该文章的内容进行解析和运行,来控制连接到计算机的各种外围设备。具体来说,控制就是指CPU和各种设备之间配合进行数据的输入输出处理。
程序的使用目的大体可以划分为两类。一类是大家作为工具来使用的程序。另外一个使用目的是用程序来代替执行人类的思考过程,见图12-1中的例子。
2.用程序来表示人类的思考方式
猜拳游戏用程序来表现:
随意决定出拳的猜拳游戏程序示例:
程序的运行结果如图12-3所示:
用随机数$^1$决定出拳的方式,同随意而定的思考方式是相同的。表12-1是该程序运行10次时计算机的出拳信息。
- 通常所说的随机数指的是统一随机数。统一随机数指的是在一定数值范围内各数出现频率相同的随机数形式。C语言中的
rand()
函数的返回值就是统一随机数。
3.用程序来表示人类的思考习惯
下面就让我们来生成一个具有习惯的程序。在代码清单12-1中,我们使用了0、1、2这3个随机数来表示石头、剪刀、布。这里,我们用0~9这10个随机数,0~4时表示石头,5~7表示剪刀,8~9表示布,这样规定后,石头、剪刀、布的百分比率就分别变成了50%、30%、20%。
4.程序生成随机数的方法
随机数色子$^1$是用来产生随机数的一种工具,每个色子有20面。晃动随机数色子后,出现在正面的数字就是随机数。由于计算机没法晃动随机数色子,因此程序一般会通过生成类似于随机数的数值公式来得到随机数。在C语言中,虽然该公式的实体是隐藏的,但只要调用rand()
函数,就可以得到结果(随机数)。不过,由于借助公式产生的随机数具有一定的规律性,因此并不是真正的随机数,通常称为伪随机数。不过,虽然是伪随机数,仍然十分有用。
- 随机数色子的各面上都标有1~20(或1~10每两个面为同一个数值)的数值。晃动随机数色子后,就可以得到1~20(或1~10)的一个随机数。
作为参考,这里介绍一个获取伪随机数的公式。该公式称为线性同余法$^1$。如果把$R_i$作为当前随机数的话,那么下一个出现的随机数$R_{i+1}$就可以用下面的公式来获取。
\[R_{i+1} = (a \times R_i + b) \ \text{mod} \ c\]
- 除了线性同余法以外,还有其他获取伪随机数的方法。如可以获得更接近“真实随机数”的“乘同余法”、“M系法”以及能够快速生成随机数的“Knuth减算法”等。
公式中出现的$\text{mod}$,是整除后取余的意思。对$a$、$b$、$c$各参数设定合适的整数后,可以从该公式获得的随机数的范围就是$0$到$c$(不包含)。因为是用$c$来进行取余,所以得到这个范围也是理所当然的。假设把$a$设定为5,$b$设定为3,$c$设定为8,获得的随机数就如表12-3所示。这里把$R_i$的初始值定为了1。可以看出,这些随机数确实很像是无规则随机出现的数值。不过,产生8次随机数后,下8次产生的随机数就和前面的数值相同了。这种周期性是伪随机数的特征,也是为什么不是真随机数的原因。
5.活用记忆功能以达到更接近人类的判断
经过多次猜拳后,我们可能就会得到类似于“小B同学在出石头后出剪刀的概率比较高”这样的经验。基于这一经验,我们就可以应用以下策略,即“刚才小B同学出了一个石头,接下来应该会出剪刀,因此计算机出石头的话就赢了”。代码清单12-3是实现该策略的程序示例。在该程序中,通过键盘输入0、1、2来决定出拳。当键盘输入0、1、2以外的数值时,结束游戏。
二维数组memory的作用:
运行代码清单12-3的程序后,就会发现计算机变强了(图12-4)。
表12-4表示的是对手连续出了15次石头时计算机的出拳信息。
6.用程序来表示人类的思考方式
到目前为止,我们已经用程序表示了直觉、想法、习惯以及经验等。不过,除此之外,人类还有一个思考方式。思考方式是思考方法的节奏。人类大脑中有类似于“石头、石头、布、剪刀”或“剪刀、石头、石头、布”这种具有节奏感的短语,人类会在此基础上做出判断,这就是思考方式。
代码清单12-4是用程序来实现思考方式的示例。这里用2维数组pattern[2][4]
来表示“石头、石头、布、剪刀”及“剪刀、石头、石头、布”这两种思考方式。人类会在不知不觉中按照自己的思考方式出拳,但连续输掉多次后也会变换一些方式。在该程序中,我们将其设定为连续输两次就改变思考方式。在时输时赢的情况下,则按照节奏以同一种方式出拳。