<style>
.reveal, .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { font-family: -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", Helvetica, Arial, PingFangTC-Light, "Microsoft JhengHei", "微軟正黑", sans-serif, "Apple Color Emoji" }
</style>
# 用Python算圓周率 $\pi$
先想想你怎麼做,再教Python
## 前言
上次我們學了用Python解立方根,是不是很有趣呢?
今天,我們再來挑戰一個到現在數學家都還在挑戰的問題:求圓周率。
---
## 怎麼求 $\pi$
首先,我們一樣要先瞭解人工怎麼求出圓周率。
- 假設圓的半徑 = r,圓面積的$\frac{1}{4}$ = A,則 $\frac{\pi r^2}{4} = A \Rightarrow \pi=\frac{4A}{r^2}$
- 假設圓的半徑為1,則 $\pi=4A$。
- 所以,只要能算出$\frac{1}{4}$圓的面積,就能算出 $\pi$。
---
## 用電腦如何計算面積

- 設定方形型範圍為 $1\times1$,以(0,0)為圓心,半徑為1的圓,有$\frac{1}{4}$面積在方形範圍內。
- 用亂數產生很多X,Y範圍為0~1的點,看有多少落在圓形範圍內,計算其比例,就是圓形部份的面積。
---
## 用Python來實作
### 取亂數
- Python並沒有內建取亂數的指令,必須匯入模組
:::danger
import random $\Leftarrow$ 匯入模組
random.uniform(0,1) $\Leftarrow$亂數範圍
random.randint(1,10) $\Leftarrow$整數亂數
:::
- 試試看下列程式,看看執行結果如何?
```python=
import random
for i in range(10):
print (random.uniform(0,1))
```
---
### 亂數夠亂嗎?
雖然random是指隨機取出來的亂數,但是其實有些系統取出來的亂數並不怎麼亂。
所以我們首先要知道亂數是不是平均分佈,要怎麼做呢?
我們可以把取出來的亂數分成兩半,看看兩邊的數量是不是差不多。
```python=
import random
count=[0,0]
for i in range(10000):
randresult=random.uniform(0,1)
if (0<randresult<=0.5):
count[0]=count[0]+1
else:
count[1]=count[1]+1
print (count)
```
當然你也可以切成10段來觀察,想想看,要怎麼切成10段?
---
### 檢查X,Y取亂數
在這個專題裡面,我們需要是一個點的X,Y座標,所以每次要取兩個亂數,分別為Xrandresult和Yrandresult。
在開始計算之前,我們一樣要先檢查取出來的亂數夠不夠亂。
```python=
import random
count=[0,0]
totle=int(input('輸入次數'))
for i in range(totle):
Xrandresult=random.uniform(0,1)
Yrandresult=random.uniform(0,1)
if (0<Xrandresult<=0.1 and 0<Yrandresult<=0.1):
count[0]=count[0]+1
else (0<Xrandresult<=0.1 and 0.1<Yrandresult<=0.2):
count[1]=count[1]+1
print (count[0]/totle,count[1]/totle)
```
同時我們可以用上次學到的input指令,輸入取亂數的次數,看看次數多或少,取出來的結果有沒有差別。
---
### 怎麼知道點是不是落在圓形範圍內
再來我們又遇到一個問題:「怎麼知道點落在圓形內還是圓形外?」
想想看,已知X,Y座標,圓形半徑為1,可以怎麼算呢?
......
這時候你們平常覺得沒有用的畢式定理就可以派上用場了。
- 畢氏定理 $a^2+b^2=c^2$,只要斜邊c小於1,就表示點在圓內。
- 所以只要點座標(X,Y)計算出來 $X^2+Y^2\leq1$ 即表示點落在圓形範圍內。
---
### Python求 $\pi$
下面有一個範例,你寫的和下面的例子一樣嗎?
```python=
import random
count=0
totle=int(input('輸入次數'))
for i in range(totle):
Xrandresult=random.uniform(0,1)
Yrandresult=random.uniform(0,1)
if (Xrandresult**2 + Yrandresult**2 <=1):
count=count+1
pii=((count/totle)*4)
print (pii)
```
算出來結果和我們背的 $\pi$ 一樣嗎?有辦法算得更精準嗎?可以再想想看喔!
###### tags: `資訊科學教學法`
{"metaMigratedAt":"2023-06-14T23:19:32.611Z","metaMigratedFrom":"Content","title":"用Python算圓周率 $\\pi$","breaks":true,"contributors":"[{\"id\":\"97f277c6-1b8d-46ee-a337-5fe0e6cfd972\",\"add\":2548,\"del\":79}]"}