4節 シミュレーション
[第5章 問題解決とその方法] 
モンテカルロ法による円周率の算出(確率的モデル)
授業 第8回
【課題】
モンテカルロ法を用いて円周率を求めよう。試行を繰り返す回数を
増やすことで円周率の近似値がどのように変化するかも調べてみよう。

【考察】
数式モデル
 [四分円の面積]:[正方形の面積]=π/4:1
多数の点を任意にとったとすると,左辺の比は,
それぞれの図形内の点の数の比に等しくなる。
 [四分円内の点の数]:[正方形内の点の数]=π/4:1
∴ π=4×[四分円内の点の数]/[正方形内の点の数]
この関係からπの近似値を得ることができる。
変数一覧
正方形内の点の数
四分円内の点の数
点の座標
点の原点からの距離
円周率の近似値
:point
:inside
:x,y
:distance
:pai
[DNCLの演算子について]
・加減乗除の四則演算 「+」 「-」 「*」 「/」
・整数の乗除  商(整数)「÷」  余り「%」
例:
11÷4*4 →  8
12÷4*4 → 12
13÷4*4 → 12
14÷4*4 → 12
15÷4*4 → 12
16÷4*4 → 16
・べき乗 「**」  例:5**2(=52
【DNCL】
inside = 0
point を 1 から 1000 まで 1 ずつ増やしながら繰り返す:
│   x = 乱数()
│   y = 乱数()
│   distance = x * x + y * y
│   もし distance <= 1 ならば:  #点が四分円内にあるとき実行
│   ⎿   inside = inside + 1
│   もし point == point ÷ 100 * 100 ならば:  #point の 100 とびに実行
│   │   pai = 4 * inside / point
⎿   ⎿   表示する("点の総数",point,":円周率の近似値",pai)
 ⇨ IDEで動作確認 
 
x<1 and y<1  x+y<=1  distance<=1  distance==1
inside-1  inside+1  poin+inside  point-inside
point/100==inside/100  point==point÷100*100
point÷100==inside÷100  point==point%100*100
4*inside/point  4/inside*point  4*inside*point
×
[通常版]
import random inside = 0 for point in range(1,1001): x = random.random() y = random.random() distance = x * x + y * y if distance <= 1: #点が四分円内にあるとき実行 inside = inside + 1 if point == point//100*100: #point の 100 とびに実行 pai = 4 * inside / point print("点の総数",point,":円周率の近似値",pai)
[研究:グラフ表示版] ※授業で用いたmonacaでは動作しません。
import random import matplotlib.pyplot as plt x_out = [] ; y_out = [] x_in = [] ; y_in = [] x_pai = [] ; y_pai = [] inside = 0 for point in range(1,1001): x = random.random() y = random.random() distance = x * x + y * y if distance <= 1: #点が四分円内にあるとき実行 inside = inside + 1 x_in.append(x) y_in.append(y) else: x_out.append(x) y_out.append(y) if point == point//100*100: #point の 100 とびに実行 pai = 4 * inside / point print("点の総数",point,":円周率の近似値",pai) x_pai.append(point) y_pai.append(pai) plt.scatter(x_in, y_in, color="red") plt.scatter(x_out, y_out, color="blue") plt.show() plt.plot(x_pai,y_pai) plt.show()