从现象中规纳出数学规律,从而方便计算,是科学的重要目的之一。而规律的发现,往往源于对现象的观察。
有些情况下,我们也许不知道规律是什么,也不知道如何推导,这时也许可以考虑直接通过多次实验来归纳结果。
蒙特卡罗方法 (Monte-Carlo Method) 就是这样一种方法。下面举两个例子。
不管你相信不相信,怕是都不容易通过计算来证明。那么,一个绕开计算的办法就是“暴力”来模拟。用程序随机给23个人分配生日并检查是否有重复,通过多次试验,从而得出概率。程序如下:
proc test_random { {n_all 1000} } {
set n_succ 0
for {set n 0} { $n < $n_all} {incr n} {
array set rvlut ""
array unset rvlut "*"
set same 0
for {set i 0} {$i < 23} {incr i} {
set d [expr int(rand()*365)]
if ![info exists rvlut($d)] { set rvlut($d) 0 }
incr rvlut($d)
if {$rvlut($d) >= 2} { set same 1 }
}
if {$same > 0} { incr n_succ }
}
puts [format "%d/%d = %f" $n_succ $n_all [expr $n_succ*1.0/$n_all]]
}
test_random 10
test_random 100
test_random 1000
test_random 10000
## 运行结果如下,可见概率确实在50%左右
6/10 = 0.600000
48/100 = 0.480000
479/1000 = 0.479000
5114/10000 = 0.511400