1946 年,洛杉矶。一个叫斯坦尼斯瓦夫·乌拉姆的波兰数学家刚从一场脑炎里捡回命,躺在病床上养病。医生不许他动脑,他偏要动——玩单人纸牌接龙解闷。
玩着玩着,一个数学家式的问题冒出来:这副牌能通关的概率是多少?
正规的做法是把所有可能的牌局列出来,数一数通关的占多少。问题是,52 张牌的排列方式是 8 后面跟 67 个零那么多种——这个数字比宇宙里的原子还多。别说算,把全宇宙的纸都拿来列清单也列不完。
乌拉姆换了个思路,这个思路简单得像作弊:
既然列不出所有牌局,那就随便玩一百局,数通关了几局,除一除,不就大概知道概率了?
对,就这么朴素。算不出来,就演出来。这个念头后来变成了二十世纪最重要的计算方法之一。
原子弹实验室里的骰子
乌拉姆康复后回到洛斯阿拉莫斯国家实验室——就是造原子弹的那个地方。他和同事冯·诺依曼(对,就是计算机祖师爷那个冯·诺依曼)正在头疼一个问题:中子穿过核材料时会怎么跑?
一个中子撞进铀块,可能直接穿过去,可能被弹开,可能被吸收,也可能撞出更多中子。每个中子的命运是一连串随机事件,亿万个中子叠在一起,方程复杂到没法直接求解。
乌拉姆想起了病床上的纸牌:中子的命运列不出来,那就在计算机里一个一个地演。让计算机跟踪一个虚拟中子,每个岔路口用随机数决定它往哪走;跑完一个再跑一个,跑一百万个,统计结果。大多数中子怎么走,真实的中子就大概怎么走。
这个方法需要一个代号。同事尼古拉斯·梅特罗波利斯提议叫蒙特卡洛方法——因为乌拉姆有个叔叔总去摩纳哥的蒙特卡洛赌场赌钱。用赌场命名科学方法,意外地贴切:它的全部精髓,就是用一大堆随机试验去逼近一个算不出来的答案。
大白话:蒙特卡洛方法 = 不会算,就模拟。让计算机把一件随机的事反复做几万次,拿统计结果当答案。名字来自赌场,因为每次试验都像掷一次骰子。
先别信,亲手试一个
光听定义没感觉,我们当场用一次。
假设你想知道圆周率 π,但你忘了它是多少。拿一张正方形的纸,在里面画一个最大的圆(圆和四边相切)。现在闭上眼睛往纸上撒一把芝麻,撒得越乱越好。然后数一数:落在圆里的芝麻有多少,总共撒了多少。
圆面积是 πr²,正方形面积是 (2r)² = 4r²。芝麻乱撒的话,落在圆里的比例约等于面积之比:
圆内芝麻数 ÷ 总芝麻数 ≈ π ÷ 4
撒 1000 粒,大约有 785 粒落在圆里,785×4÷1000 ≈ 3.14。π 就这么被芝麻"撒"出来了。
这就是一次完整的蒙特卡洛:问题本来是算面积(几何问题),你不会算,就改用随机抽样(撒芝麻),用频率逼近答案。样本越大,答案越准——100 粒芝麻可能给你 3.4,100 万粒就能逼近 3.14159。
为什么偏偏是这个时代
随机试验的想法其实不新鲜——18 世纪的蒲丰就用扔针估算过 π。但在手算时代,这方法纯属行为艺术:谁有时间撒一百万次芝麻?
蒙特卡洛方法等到 1940 年代才登场,因为它在等一个东西:不知疲倦、不会抱怨、掷骰子掷得飞快的机器。冯·诺依曼手里正好有一台——ENIAC,人类最早的电子计算机之一。理论(乌拉姆的纸牌念头)、需求(原子弹的中子)、机器(ENIAC),三样凑齐,方法才真正活了。
这个细节值得记住:蒙特卡洛方法从第一天起就是人和机器的分工——人负责把问题翻译成"一件可以反复模拟的随机的事",机器负责不知疲倦地掷骰子。到今天,这个分工没变,只是掷骰子的机器从 ENIAC 变成了你口袋里的手机,而负责"翻译问题"的角色,正在从程序员变成 AI。这是这本书后半部分要讲的事。
一句话收个尾
下次有人问你什么是蒙特卡洛方法,可以这么答:
一副牌有多少种结局,列不出来;玩一万局,就大概知道了。蒙特卡洛方法就是让计算机替你"玩一万局"。
但这里藏着一个更深的问题:为什么"玩一万局"能代替"算出来"?它什么时候可靠,什么时候骗你?下一章我们从这里往下挖。