哲学问题4(很现实!!!):“我该摸哪张牌?”
大约在1994年,我受一些FC上的RPG游戏的启发,自己也编写了一个类似Monopoly(有模仿者名曰“大富翁”,当时讹称“强手棋”)的游戏。
在这个游戏中,主人公(Player)要在棋盘样地图上的格子序列中,前行赴关、斩将沙场。当主人公触发到某些条件时,便会进入“Chance Cards Gambling”小屋。
在小屋中,布置有一张牌桌。桌上放了10张正面暗扣住的牌(Chance Cards)。显示为如下形式:
+---+ +---+ +---+ +---+ +---+
| | | | | | | | | |
| G | | G | | G | | G | | G |
| | | | | | | | | |
+---+ +---+ +---+ +---+ +---+
+---+ +---+ +---+ +---+ +---+
| | | | | | | | | |
| G | | G | | G | | G | | G |
| | | | | | | | | |
+---+ +---+ +---+ +---+ +---+
Player(你)选择其中一张,摸下,牌面亮出。牌面的内容,会对主人公的状态或故事进程,有一定的影响。比如:
如果你摸到了“S. Jobs”的话,那么,在你的装备库里,会增加一部iPhone 4S手机;
如果你摸到了“Optimus Prime”的话,那么,你在陆地道路上的行动速度,将在接下来的N个移动回合中翻倍。
如果你摸到了“Milk Powder”的话,那么,你就会立即进入中毒状态(脸发黑,面状痛苦),在接下来的N个战斗回合中,你的攻击力会变为健康时的1/10。
如果你摸到了“玉凤姐姐”的话,那么,你在接下来的N个战斗回合中,将不战而胜。
如果你摸到了“龙牡壮骨冲剂”的话,那么,你的HP值会立即补满(程序会作出“波波波——波波——波——”的音效)。
如果你摸到了“烫烫烫烫老教授”的话,那么,你的兵器不会发红发烫,而是,你将在棋盘上倒退N格。
…… ……
我们先这样假设:
牌的张面,有许多样,比如有50样(可以把“一休哥”、“爸爸李刚”、“青蜂侠”、“铁扇公主”、“Bill Joy”等等这些人物,甚至“硅胶”、“(葫芦娃的)葫芦”、“装满冰的壶”、“华南虎(年画)”等等这些东东,都请过来。(哇——!游戏的Manual文档要写很长了……)
并且,有许多许多张牌,比如1000张牌,但不同的张面在其中是平均分布的(即每样张面都有20张牌)。这1000张牌,放在小屋的牌盒里,且是充分随机排列存放的。
小屋内,有一名Showgirl侍立。主人公(你)一进屋,Showgirl先呼一声“大哥好!”,你应“妹妹好!”,“大哥征途辛苦了!”,“为圣战服务!”…… 一番彼此亲切问候之后,Showgirl从牌盒里,顺次取出10张牌。为充分证明Showgirl和小屋主人决不会耍老千的诚信人格,可在取牌之前,由Showgirl当着你的面,将牌盒里的那1000张牌dump出来,多次洗乱、搅匀,再码齐放回盒中。然后,Showgirl的玉手利落翻覆、上下操持,将取出的那10张牌,依前图所示,整齐地暗扣于牌桌上。
此时,你双膝着地,跪于桌前,两手合十,小声默吟一通神咒,仍觉不足,再行十字圣号手礼,叽里咕噜一番,以阿们毕礼,还嫌自己不够敬虔,索性顿首下去 —— 怎料你的动作幅度太大,双眼又是紧闭,一脑门撞在牌桌腿儿上。牌桌咣咣唧唧,摇晃了几下,抖落出一张牌。此牌飘下,落地时张面暴出。
“就是它乐呢!” Showgirl说,一边弯腰,俯身半蹲,拈起此张,往你眼前一亮。
你仓促回神,只见牌面上显一行小字 —— “Please Draw Out Another Card As The Determination!”
接下来,为确保几率均衡,所有牌张,包括Showgirl手上1张、桌上9张、盒中990张,合起来1000张牌,再次被洗乱、搅匀、码齐、回盒,而后被顺次取出10张扣于桌上。
于是,你此时也不顾已汗流夹背,再施大礼,谨慎举止。桌上10张暗牌在你脑际不断盘旋。你忽似感应天启,立身注视桌台,把那10张暗面,逐一盯过来、看过去,花上十几分钟。最后,你屏气凝神,恭请一张。Showgirl葱指一撩,拨亮牌面:是个“星号” …… ……
上述过程,看似狎趣,但若*真的要*在编程时,“忠实”地令所有功能和过程(包括关于牌张、牌盒、洗牌、存牌、发牌、取牌……等等的各环节)得意重现,作为编程者的我,要做的事情,其实还是非常繁多的,至少要有:
(1)定义并初始化一个50*20的牌张数组。
(2)罗织一个尽可能接近真实随机过程的随机函数。
(3)开辟一块能容下1000张牌的存储空间(即“牌盒”),以备随后各张随机安插入内。
(4)安排函数,取出上述空间中的头10个元素,顺次压入一个“桌面”数组。
(5)令Player可以选定上述数组的某一下标,取出决定牌。
这样一来的话,程序的运算量和存储耗费量,都是非常巨大的。
我可以简化一下整个运算过程,也就是:越过第(3)步,直接从第(1)步的数组中,按第(2)步所设置的随机函数,选取10张压入第(4)步的“桌面”数组。即,略弃了“牌盒”这一个设施,节省了1000个元素的存储空间。
—— 这样的话,是完全不违背统计学与概率法则的,且满足公平原则,不是嘛?
我还可以进一步简化:越过第(4)步,把第(2)步所设置的随机函数,安排在Player执行第(5)步即选牌的时候运行。即:在Player选牌的时候,随机函数才被执行,得到一个关于第(1)步数组元素的随机结果。这样的话,我又节省了10个元素的存储空间,即略弃了“桌面”这个设施。
—— 这样的话,同样是完全不违背统计学与概率法则的,且满足公平原则,不是嘛?
我还可以再进一步简化:将第(1)步中的数组,直接设置为50个元素,即是50样牌面的双射。在Player选牌的时候,对上述50个元素执行第(2)步所设置的随机函数,得到一个随机结果,作为决定牌。这样的话,我又节省了950个元素的存储空间。
—— 同样完全不违背统计学与概率法则的,且满足公平原则,不是嘛?
下面,我继续大胆地进行简化:把第(2)步所设置的随机函数,提前到Player进入小屋的时候执行。即:在Player进入小屋时、选牌之前,一张由随机函数得到的决定牌,就已经在程序的后台准备好了!
—— 这样一来,仍然既完全不违背数学法则,也还保持满足公平原则。为什么?因为:先由电脑程序执行的随机函数,以及再由Player选牌时候发生的随机过程,两者叠合,能够得到每一样牌面的概率,是公平的1/50。而直接由电脑程序执行随机函数,得到每一样牌面的概率,也是公平的1/50。前后两种方法,公平性和结果概率,恒等。所以,可以将Player选牌时的随机过程彻底忽略。当然,Player对这一切浑然不知,若是他/她知道了,会不会恼羞成怒?“枉费我一番三叩九拜!”不过,我完全可以把上述理由,解释给他/她听。而且,我还要强调,在第(2)步里所设置的随机函数中,随机结果乃是一个预先不能确定的时间或时刻的函数,也就是说,决定牌虽然是在Player进入小屋的时候,就已经确定,但毕竟也是Player自由意志选择进小屋时机的结果,一切主动权利,仍在Player的手中,我并未干涉或出千 —— 除非你认为Player三叩九拜果真能临获神示,洞穿暗牌。
最后,我进行一个彻底的变化(不一定是优化了):把第(2)步所设置的随机函数,提前到整个游戏的一开始执行!我准备好一个充分大的数组,比如能容下800个元素。那么,我让随机函数在游戏一开始,执行800次,每次都是从完整的50样牌中,获取一个随机结果,再将每个结果顺次压入上述数组。这800张决定牌,用在Player此后800次“选牌”时亮出。(满了800次,就再初始化一回。)这就意味着,在Player按下游戏Start按钮的那一刻,800张决定牌就已经确定好了,只等他/她接下来逐个打开获知了。—— 这仍然不违背数学法则和公平原则,因为,如我上面所讲的,随机结果仍然是时间或时刻的函数。所有的一切,还是交给Player的动作时机来决定。
关于游戏的整个事情,讲完了。
下面来扯扯哲学……
这个游戏对Player公平吗?我说:绝对公平。当你知道整个“黑箱操作”的实际过程和其中原理,也不会否认的吧!
可是,当Player知道这一切后,他/她会怎么想?
如果他/她仅仅是旁观者,也不会否认这很公平。但是,当下的他/她,就是一名Player,玩的就是游戏中所要经历的一种“赌运”。这种“赌运”,要在他/她每一次进小屋“选牌”时去享受。
然而,现在Player知道了,他/她每一次“选牌”的结果,已经在运行游戏早期的某一时刻就被决定了,他/她当然会觉得被剥夺了在“选牌”时自由意志上的公平性。但从另一方面来看,那种被早期就决定好了的结果,却仍终归是Player自由意志的结果(只是他/她被蒙在了鼓里而已),所以,他/她的自由意志并没有被褫夺,游戏的公平性也没有丧失。Player在游戏接下来的时光中,只不过是在揭晓之前已经被确定的结果罢了。
我们总喜欢找一个“客观公正”的第三方来审度事情。现在,这第三方真的有了 —— 这个游戏的源代码一公开,任谁都可以来做这个客观的第三方 —— 这个第三方,只要理解万世颠簸不破的数学法则,就必然不会否认:这个游戏对于所有人,都是完全公平的!
但,这又怎能平复Player心中矛盾的纠结呢?
人生在世,跟这个游戏比起来,岂会更加公平呢?
…… ……