术语是划分圈子的利器(阻碍交流的罪魁祸首)。——狗尾草
首先,记住一个酒局
在讲蒙特卡罗方法之前,我先讲一个真实的故事。
几年前的一个夏夜,我和几个同事在擀面,喝啤酒,摇骰子。当时的一段对话是这样的:答:“三不知道”
乙:“四不知道”
a:“开,你喊四我就开!”
乙:“你真是只老虎!”
答:“怎么,你喊四个,肯定是赢少输多!”
b:“那倒不一定。很多时候是四个!”
答:“当然,六个骰子中有四个是相同的,这种可能性很小!”
。。。。。。
然后,三个晕乎乎的渣博士坐在那里,口算了将近一个小时的概率。每个人的计算结果都不一样,谁也不知道谁是对的。
掷骰子的规则很简单。对于三个骰子来说,掷出的1是万能的,可以作为任何数字。
我数学差,考完试概率就没了。第二天,喝完酒醒来,这个问题还是让我很“苦”。然后我花了一些时间写了一个程序来验证这个问题的答案。先说答案。答案是,如果B喊4不知道,A就开,那么A赢的概率大概是63%。
我的方法是蒙特卡罗方法。
二、蒙特卡罗方法
蒙特卡洛不是一个人,是一个地名蒙特卡洛,位于摩纳哥,是世界著名的赌场(拉斯维加斯除外)。现代计算机的开创者冯·诺依曼给这种方法命名,无缘无故地给这种方法增添了许多神秘的色彩(阅读障碍)。其实这种方法的思路特别简单易懂,早就有了。
注意,蒙特卡罗方法不叫蒙特卡罗算法,因为它没有明确的实现步骤。它只是一个想法,而且它的想法特别简单。借用我上面说的例子:既然我算不出概率,那我就放弃计算,直接掷骰子十万次,算赢的次数。按照简单的概率论,只有样本量足够大,我一定会无限逼近真实概率。
事实上,世界上已经有人这样做了。比如为了验证抛硬币的概率,据说下面这些数学家充满毅力(疯狂)地抛硬币:
德·摩根投了4092次,布冯投了4040次,费雷尔投了10000次,皮尔森投了24000次,罗曼诺夫斯基投了80640次。(不知道这个有没有吉尼斯世界纪录,可以试试)
掷骰子十万次是一件很可怕的事情,光是想想就会让你发疯。所以这种方法虽然很早就出现了,但是直到计算机的出现才开始普及。用电脑掷骰子是不是太简单了?几十秒就能扔出去。
于是,计算机诞生后,蒙特卡罗方法开始大放异彩。有很多东西理论上很难计算和推导。没关系。我们用计算能力来解决它们。因为我们最终并不想要一个精确解,有一个近似解就够了。
所以蒙特卡罗方法的简单思想可以总结为一句话:用(计算机模拟)实验的方法求概率。
3.蒙特卡罗方法的应用
蒙特卡罗方法在很多领域非常有用,在某些领域,它几乎是唯一的方法,但是不要被我上面的例子和那个定义所限制,以为它只是求概率,其实不是,比如下面的例子。
1.如果不知道圆周率的π值,也不知道圆的计算公式,有一个圆,怎么求面积?
充满随机点的圆蒙特卡洛法说:简单,先在圆的外面画一个外接圆,然后生成100000个随机分散在圆里面的点,然后数圆里面有多少个点(计算每个点到圆心的距离,如果距离小于半径,就表示在圆里面),然后把这个数除以100000,再乘以正方形的面积。
2.这里有个奇怪的函数,求积分?
一个奇怪的函数蒙特卡洛法说:简单,直接在这个区域随机撒10万个点,统计有多少个点在函数下面(根据当前点的X值计算函数值Y '并与该点的Y值比较,Y < Y '代表在函数下面),然后将这个数除以10万,乘以该区域的面积。
3.有一个机械产品是10个零件叠起来的,要求整体厚度小于30mm。但是每个部分的厚度都有一定的误差概率,超过了最大范围。整个产品的最终合格率是多少?
蒙特卡洛法说:简单,随机模拟10万个装配,在每个装配过程中按照概率随机产生每个零件的误差,然后统计最终厚度,将厚度小于30mm的产品统计为合格品,然后计算比例。
从上面的例子中,你大概可以了解蒙特卡罗方法的思路,思考它在自己的研究领域是否有应用价值和意义。
四。樊外文章
自从那家酒企之后,我好像突然发现了选研究生的诀窍。这几年,如果我对他的知识背景不是太确定,我会扔给他两道编程题,让他两天内解决。其中之一就是这种掷骰子计算概率的方法。其实如果C基础好,稍微有点想法,十分钟之内完全可以解决这个问题。可惜几年来,我只遇到一两个能通过编程解决这个问题的人。