1.問題描述與思路
前提是已知圓的面積公式 S = pi * r * r
假設在一个邊長爲1的正方形中建立一个能容納的最大的圓, 則圓的半徑r=1, 那麼在正方形內隨機選擇一个點, 則此點出現在圓內的概率爲S圓/S正方形;
對于任意點(x, y), 當算式x*x + y*y <= 1時, 則點在圓內;
因此可以進行多次模擬落點, 並統計符合上述條件的落點次數, 得到落在圓內的概率爲 n中/n總, 故而推導出 pi = 4 * n中 / n總.
2.實現代碼
# 已知S=pi*r*r, 求pi值
import random
number_trails = int(input('請輸入你想模擬的次數:'))
number_hits = 0 # 落到pi範圍內的
for i in range(number_trails):
x = random.random()*2 - 1
y = random.random()*2 - 1
if x**2 + y**2 <= 1: # 判斷是否落在圓內
number_hits += 1
pi_test = 4*number_hits/number_trails
print(f'經過{number_trails}次模擬, pi的近似值爲{pi_test}')
注意, random.random()函數的返回值是大于等于0且小于1的隨機值.
3.試運行
請輸入你想模擬的次數:10000000
經過10000000次模擬, pi的近似值爲3.142548
請輸入你想模擬的次數:50000000
經過50000000次模擬, pi的近似值爲3.14158208
請輸入你想模擬的次數:100000000
經過100000000次模擬, pi的近似值爲3.141853
實際精度並不太高, 在五千萬次和一億次模擬後, 也僅僅精確到3位小數而已.
顯然是這个算法的缺陷.