Day9 蒙特卡洛法(求圓周率)

2021-09-25 02:44:17 字數 1589 閱讀 6265

在只有乙個隨機數生成器的情況下如何估計π的大小?

蒙特卡洛法:

蒙特卡洛方法又稱統計模擬法,隨機抽樣技術,是一種隨機模擬方法,以概率和統計理論方法為基礎的一種計算方法。是使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。將所求解的問題同一定的概率模型相聯絡,用電子計算機實現統計模擬或抽樣,以獲得問題的近似解。為象徵性地表明這一方法的概率統計特徵,故借用賭城蒙特卡羅命名

早在17世紀,人麼就知道用事件發生的「頻率」來決定事件的「概率」。這也是蒙特卡洛法的基本思想。當樣本數量足夠大時,我們可以用頻率去估計概率。這也是求圓周率π的常用方法。

當我們在(0,1)的範圍內隨機選擇乙個座標(x, y)時,每個座標點被選中的概率相等。則座標落在直徑為1的正方形中的圓的概率為:

由切比雪夫不等式可知,在生成大量隨機點的前提下我們能得到盡可能接近圓周率的值。

#1

from random import random

from time import perf_counter

darts = 1000*1000

hits = 0.0

start = perf_counter()

for i in range(1, darts+1):

x, y = random(), random() #random()返回隨機生成的乙個實數,它在[0,1)範圍內。

dist = x ** 2 + y ** 2 #等價於dist = pow(x ** 2 + y ** 2, 0.5)

if dist <= 1.0:

hits = hits + 1

pi = 4 * (hits/darts)

print("圓周率值是: {}".format(pi))

print("執行時間是: s".format(perf_counter() - start))

#2import numpy as np

from time import perf_counter

def pi(n, batch=1000):

t = 0

for i in range(n // batch):

### 隨機獲取座標(batch個點)

p = np.random.rand(batch, 2) #以給定的形狀建立乙個陣列,並在陣列中加入在[0,1]之間均勻分布的隨機樣本。

### 計算座標平方和

p = (p * p).sum(axis=1) #陣列元素對位相乘,最外圍axis=0

### 平方和小於1的即為落在圓中的點

t += (p <= 1).sum()

return 4 * t / n

start = perf_counter()

pi = pi(10 ** 8)

print(pi)

print("執行時間是: s".format(perf_counter() - start))

注:numpy 陣列和矩陣的乘法的理解

蒙特卡洛法求圓周率

利用蒙特卡洛演算法求圓周率是乙個概率的方法,關於這方面的內容很多,而且也很容易理解,更多具體分析過程可以參考如下文章 下面是我的理解和 蒙特卡洛演算法是通過概率來計算pi的值的。對於乙個單位為1的正方形,以其某乙個頂點為圓心,邊為半徑在正方形內畫扇形 乙個1 4的圓形的扇形 那麼扇形的面積就是pi ...

利用蒙特卡洛演算法求圓周率

from 背景知識 蒙特卡洛是摩納哥公國第一大城市,與澳門 美國拉斯維加斯並稱世界三大賭城。位於地中海沿岸,首都摩納哥之北,建於阿爾卑斯山脈突出地中海的懸崖之上。景色優美,是地中海地區旅遊勝地。市內置有豪華的旅館 俱樂部 歌劇院 商店 游泳池 溫泉浴室 運動場等娛樂設施 城內開設有蒙特卡洛大賭場。賭...

圓周率 的值 用蒙特卡洛法求 近似值

2 2 3 2 3 2 5 2 3 2 5 3 7 圓周率的值 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280 34825 34211 70...