在只有乙個隨機數生成器的情況下如何估計π的大小?
蒙特卡洛法:
蒙特卡洛方法又稱統計模擬法,隨機抽樣技術,是一種隨機模擬方法,以概率和統計理論方法為基礎的一種計算方法。是使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。將所求解的問題同一定的概率模型相聯絡,用電子計算機實現統計模擬或抽樣,以獲得問題的近似解。為象徵性地表明這一方法的概率統計特徵,故借用賭城蒙特卡羅命名
早在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...