---
# System prepended metadata

title: 用Python算圓周率 $\pi$
tags: [資訊科學教學法]

---

<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
<br>
請選擇右上角 **分享** <i class="fa fa-share-alt fa-18"></i> 清單裡面的 <i class="fa fa-tv"></i> **簡報模式**，然後點選 **預覽** 來觀看簡報。

###### tags: `資訊科學教學法`

---

## 怎麼求 $\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$。

---

## 用電腦如何計算面積

![](https://i.imgur.com/5Jj3wku.png =200x200)
- 設定方形型範圍為 $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))
```

---

### 亂數夠亂嗎？

- 怎麼知道亂數是不是平均分佈？

```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段來觀察

---

### 檢查X,Y取亂數

- 在這個專題我們需要X,Y，一樣來檢查看看。

```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$
- $\Rightarrow 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$ 一樣嗎？有辦法算得更精準嗎？

