蒙特卡羅算法解析

祖沖之計算圓周率的故事,大家都耳熟能詳了。下面介紹一種更加直觀簡單的方式。讓你大開眼界。

這種方法就是蒙特卡羅方法。

蒙特卡羅方法是一種以概率統計理論為指導的一類數值計算方法。最初由美國在第二次世界大戰中研製原子彈的“曼哈頓計劃”計劃的成員S.M.烏拉姆和J.馮·諾伊曼於20世紀40年代提出。

數學家馮·諾伊曼用馳名世界的賭城—摩納哥的Monte Carlo—來命名這種方法,為它蒙上了一層神秘色彩。

這就是職場面試中被經常問到的,大名鼎鼎的:蒙特卡羅算法!!

蒙特卡羅算法解析 - 如何計算圓周率

他是如此的非常強大和靈活,但是呢又相當簡單易懂,實際上很容易實現。

對於許多問題來說,它往往是最簡單的計算方法,有時甚至是唯一可行的方法。最典型的例子就是π的值的計算。

蒙特卡羅算法解析 - 如何計算圓周率

π的值的計算方式我們可以通過來畫一個正方形,在再其內部內部畫一個相切的圓,通過計算會得到圓和正方形的面積之比是π/4。

計算思路如下:

  1. 首先通過隨機數,產生無數個點,這些點均勻的落在正方形的內部。就像我們投擲飛鏢一樣。
  2. 然後,根據點距離圓中心的距離,可以判斷點是否落在圓內,還是圓外?

因為假設點是均勻分佈的,圓內的點的數量佔比應該是全部的 π/4。

<code>π=4*圓內的點數量/全部點的數量。/<code>

π就輕鬆的算出來了。

蒙特卡羅算法解析 - 如何計算圓周率

這個算法,非常適合使用計算機來實現,統計的點越多,計算的π約精確。

下面是使用python的代碼:

<code>from random import random
from math import sqrt

total = 10000
x = y = inn = out = 0.0
for i in range(total):
    x = random()
    y = random()
    if (i % (total/10) == 0):
        print(i)
    if (sqrt(x * x + y * y)<1.0):
        inn += 1.0
    else:
        out += 1.0
print(total, inn, out)
print(inn*4 / total)/<code>

計算結果:

當total=10000時,計算的結果為3.15

當total=100000時,計算的結果為3.14528

當total=1000000時,計算的結果為3.141228

當total=10000000時,計算的結果為3.141518

當total=100000000時,計算的結果為3.14186572

當total=1000000000時,計算的結果為3.14166922

小夥伴們,你們get到了嗎?


分享到:


相關文章: