随机不是随意
凯凯兔老师在课上布置了一个任务,要求学生利用程序,生成并上交一个包含有5000个英文字母的文件,且字母排列毫无规律,均由计算机随机函数产生。眼看离下课时间不到10分钟,卡卡兔同学由于程序出错,无法完成任务,他心生一计:既然是由随机函数产生的毫无规律的字母,并且老师只要求上交结果而不须附带程序,那么直接用键盘随意敲打凑足5000字母,不也同样能交差?于是他依计而行,用键盘随意输入了5000个字母后提交了作业。然而,让他没能想到的是,这份作业最终还是得了不及格,请问凯凯兔老师可能通过哪些线索识破卡卡兔的“诡计”?
《辞海》对于随机现象的解释是:在一定条件下,并不总是获得相同的结果。“总是”这个词语意义重大,假设产生数字0到9的概率相同,那么前一次产生一个0,而后一次也可能再次产生一个0,且机率并不降低。这一点是识破凯凯兔“诡计”的关键线索。通常情况下,快速随意按键时重复击打同一字母的概率大大减少,所以说,可编写循环语句程序,通过计算文件中连续重复字母出现的频率判断文件是由随机函数产生还是由手工输入。
比如,使用语句PSet (Rnd(1) * Form1.ScaleWidth, 100)在水平方向上随机打点,多次实验后发现,经常出现许多点都挤在一起的情况(如图),这是正常现象吗?美国著名的电视系列剧《数字追凶》中的一集,FBI就是通过此现象,判断出一系列的相似案件究竟出于一个罪犯之手,还是由多个无关的罪犯所为。
图:随机打的点,经常会挤在一起
代码是用很“古老”的VB写的,但在演示这种简单问题时的确很高效。
随机从哪里来
如果说要随机产生数字0到9,按理说,下一次产生什么数字,是不可预测的。然而,凯凯兔老师却拥有让学生惊讶不已的能力,因为他总能通过“特异功能”猜出下一个生成的随机数字是什么。老师是怎么做到这一点的?此问题与计算机伪随机序列有关。
到现在为止,传统架构(图灵机和图灵完备的计算装置)的计算机却很难产生真正的随机数。计算机通过数学方法从某些数学函数生成的貌似混沌的序列中抽取数字,产生统计学意义上的伪随机数。
比如,有一只象极了真正小狗的机器小狗,在表示高兴时,它有时会汪汪叫,有时会吐舌头,有时会摇尾巴,有时会打滚,没有人能预料究竟它会做哪一样。然而这是一种伪随机现象,并且大家日常所使用的电脑,都是通过伪随机来模拟真正的随机现象。将来计算机能否产生真正的随机现象呢,这是一个相当深奥的问题,至今科学家和哲学家们都还为此争论不休呢。想来也是,如果机器是按规则运行的,它就无法真正“随意”行事吧。如果机器不是按规则运行的,那么怎么把它造出来。
现在常见的产生真随机的办法,都是从大自然中“借”来不确定。比如,简单一些的,从麦克风里录制一段自然界的声音,复杂一些的,科学用持续几万亿分之一秒的激光脉冲照射钻石,激光进入和出来的方向发生了变化。这样就产生了真随机数。另外一种奇怪的办法是利用收音机接收一些无人用频道的讯号,得到真正随机的随机数。真随机数发生网站random.org就是这么干的。
许多人工智能的引擎,会加入随机这个特性,使得系统看上去更接近人类的行为。比如智能对话引擎AIML,里面可以用<random>标签,使得系统的反应每次都有所不同,举例如下:
<category>
<pattern>你说的话真是出于自己的想法吗?</pattern>
<template>
<random>
<li>这有什么可怀疑的,这是绝对侮辱!</li>
<li>我是有超级智能的,想说什么就说什么。</li>
<li>你能保证你自己说的话就是出于自己的想法吗?</li>
</random>
</template>
</category>
这使得一个完全机械的程序的行为表现得象是人类,如果借助外在声光变化、电磁波乃至宇宙射线、量子波函数坍塌什么的来获取真随机数,那么它的表现就更象人类那样难以捉摸了。可是,若进一步反问,你自己的头脑是否有可能就是这么干的,你大概不会轻易同意的吧(什么?难道考虑了一晚上做出的重大决定是受到了随机现象的影响)。啊,对了,你这种不同意的态度是否还是受某个随机值的影响呢?
暂且搁置关于随机的扰人的哲学讨论,来看一个小谜语,请问如何利用随机函数,随机产生出2、-1、 0.5中任意一个数字?
有你想看的精彩