绣花针与圆周率
(2009-04-02 09:18:30)
标签:
数学投针 |
在电视剧〈暗算〉里,数学天才黄依依将祖冲之当作“数学之神”,在接手破译“光秘”的任务时,还向他的塑像盈盈下拜,可见老祖的地位非同一般。本人的数学生涯至高考戛然而止,完全是个门外汉;所以,暂不去讨论老祖的那套玩意儿到底是真正的数学还是仅仅算术而已。祖冲之把圆周率推算之小数点后七位,这是货真价实的成就,但是,他老人家咋算的呢?
魏晋之际的数学家刘徽用的是“割圆术”,刘子曰:“割之弥细,所失弥少。割之又割,以至于不可割,则与圆周合体而无所失矣。”根据这一思想,老刘一直割到了圆内接正三千零七十二边形(他真有那个闲工夫),求得了3.1416,这就已经很费劲了。祖冲之比他猛多了,但没人知道老祖是怎么捣鼓出来的。据说,这事儿记录在祖冲之的《缀术》里,可惜,失传了。后人只能推断他也是用了“割圆术”,诸位想想看,那TMD得割多少边啊。
还有个更麻烦的方法可以求得圆周率。这个方法也许谈不上更先进,但对于我等数学盲来说,确实是更加匪夷所思。1777年,有个叫布丰的法国佬提出了相当BT的“投针问题”,即:
“在平面上画有一组间距为d的平行线,将一根长度为L(L<d)的针任意掷在这个平面上,求此针与平行线中任一条相交的概率。”
解铃正是系铃人,布丰本人证明了,此概率为p=2L/(πd) (证明略,但你无须怀疑它的正确性)。既然这个概率非常令人困惑地与圆周率联系在一起,那么,当然也就可以通过大量投针来求得圆周率的近似值。投针的次数越多,针与平行线相交的次数与总投针次数之比将越接近理论概率值,得到的π值自然也就越精确。这件看似无聊的事情真有不少人干过,但人的耐心总是有限度的,投针次数的不足使得结果不尽如人意。公元1901年,猛人来了。当年,意大利数学家拉兹瑞尼作了3408次投针,给出π的值为3.1415929——准确到小数后6位。这实在太不可能,因为经过理论计算,得投针88.7万次以上才能使计算结果精确到小数点以后三位。拉兹瑞尼只投了三千多次,居然算到第六位,他的手气也未免太好了,好到让人怀疑他根本就没投过针。
有时数学也可以令人废寝忘食,尤其是当人“独在异乡为异客”的时候。本人当然不会真的去投针,那得投多少次啊,好比李莫愁对杨过发动了冰魄银针的“饱和攻击”,太恐怖了。都啥年代了,咱可以用计算机“仿真”。我编写的程序应该是没什么大问题,虽然代码不够简洁,界面也远不够友好,但算法是对了。我“投”了一百万次针,算出的圆周率居然是3.144。
这大概不能怪我,要怪只能怪随机数产生的不够好。也就是说,不够“随便”。事实上,“随便”还真不是一件容易事儿,计算机里没有“自由意志”。无论采用什么方法,计算机产生的随机数都不是真正的随机,在一定范围内可以表现的毫无规律,“前言不搭后语”,但实际上它是被计算出来的,即所谓“伪随机数”也。C语言的“库函数”rand()就是用来产生随机数的,其内部实现为“线性同余法”。不管计算机如何突飞猛进的发展,只要仍然是在冯诺依曼机的框架里转圈,我们就不会看到计算机能够产生绝对随机的随机数。
p.s.
为什么我会提到这个问题呢?因为我正在“研究”蒙特卡洛方法(Monte Carlo method),即通过概率实验所求的概率来估计我们感兴趣的一个量,而“投针”实验正是近代蒙特卡洛方法之滥觞。
如此,别说投针求π太疯癫,只是你的眼睛看不穿。