蒙特卡羅方法是一種統計模擬方法,由馮·諾依曼和烏拉姆提出,在大量的隨機數下,根據機率估計結果,隨機數據越多,得到的結果越精確。下面咱們將用python實現蒙特卡羅方法。python
1.首先咱們作一個簡單的圓周率的近似計算,在這個過程當中咱們要用到隨機數,所以須要先使用import numpy as np
導入numpy庫。dom
2.代碼實現:工具
import numpy as np total = 8000000 count = 0 for i in range(total): x = np.random.rand() y = np.random.rand() dis = (x**2+y**2)**0.5 if dis <= 1: count = count+1 PI = 4*count/total print(PI)
3.在上面的程序中咱們用8000000個隨機數進行投放,這樣獲得的結果會更精確一些,運行程序須要必定的時間,最終獲得的結果以下編碼
4.下面咱們進行一項簡單的應用,下圖爲我在畫圖工具中隨便畫的一個圖,咱們能夠用蒙特卡羅方法來估算圖中黑色部分的面積。spa
5.上面的圖形是不規則的,咱們只需知道在投放大量隨機數的狀況下,隨機數在黑色部分出現的機率,再用總面積相乘便可估算黑色部分的面積。咱們知道,黑色的rgb編碼爲(0,0,0),因此須要統計rgb編碼爲(0,0,0)時隨機數的投放機率便可。code
6.代碼實現:圖片
from PIL import Image import numpy as np im = Image.open("C:/Users/21974/Desktop/handwrite2.PNG") total = 9000000 count = 0 defin = 0 width = im.size[0] height = im.size[1] for i in range(total): #用蒙特卡羅方法得到估計值 x = np.random.randint(0, width-1) y = np.random.randint(0, height-1) k = im.getpixel((x, y)) if k[0]+k[1]+k[2] == 0: count += 1 print(int(width*height*count/total)) for i in range(width): #用遍歷得到準確值 for j in range(height): k = im.getpixel((i, j)) if k[0] + k[1] + k[2] == 0: defin += 1 print(defin)
上面的代碼可分爲兩部分,第一個for後面是用蒙特卡羅方法得到的面積的估計值,第二個for後面是用遍歷全部像素點的方法得到的面積的精確值,得到兩個輸出後進行對比。rem
咱們在上面的程序中採用了9000000個隨機數,能夠看出兩個輸出結果相差並不大。get