単に円周率を使いたいなら
import math
print(math.py)
で良いんだけども、3.14がどうやって求まっているのか自分でやってみたい。
というわけで確率的モデルで円周率を求めていきたいと思います。
第一象限の適当なところに点を打っていく
まずx座標とy座標それぞれで、0から1のランダムな数値を定めて点を打ちます
import random
x, y = random.random(), random.random()
x^2+y^2が1以内かどうか確かめる
このxとyをそれぞれ2乗してお互いに足し合わせた数が1以内であれば、点は半径1の円の内側にあることになります。
number = x ** 2 + y ** 2 #これが1以内であれば円の内側
何回も繰り返して近似値を見る
これを何回も繰り返して、繰り返した数を分母、1以内だった回数×4(全ての象限で同じ結果になると仮定する)を分子とすると、円周率が算出されます。試しに1000回くらい繰り返してみましょう。
import random
incount = 0
def GenerateRandom():
x, y = random.random(), random.random()
number = x ** 2 + y ** 2
return number
iteration = 1000
for ite in range(iteration):
check = GenerateRandom()
if (check < 1):
incount += 1
quadrant = 4 #全象限
print(incount * quadrant / iteration)
3.2
うーん、微妙。数が少なかったようなので1000万回で試してみましょう。
# 5秒くらいかかります
3.141382
良きかな。
可視化してみる
数字が出ただけだとあんまり感動しなかったのでmatplotlibで可視化してみましょう。
まずは1000回バージョン
import random
import matplotlib.pyplot as plt
def GenerateRandom():
x, y = random.random(), random.random()
number = x ** 2 + y ** 2
return [number, x, y]
iteration = 1000
for ite in range(iteration):
check = GenerateRandom()
if (check[0] < 1):
plt.scatter(check[1], check[2], c = 'red', s = 10)
else:
plt.scatter(check[1], check[2], c='blue', s = 10)
plt.title('Monte Carlo Method')
plt.xlabel("x")
plt.ylabel("y")
plt.show()
10秒くらい待つと…
イマイチ分かりにくいので1000万回バージョンをみてみましょう。
import random
import matplotlib.pyplot as plt
def GenerateRandom():
x, y = random.random(), random.random()
number = x ** 2 + y ** 2
return [number, x, y]
iteration = 10000000
for ite in range(iteration):
check = GenerateRandom()
if (check[0] < 1):
plt.scatter(check[1], check[2], c = 'red', s = 10)
else:
plt.scatter(check[1], check[2], c='blue', s = 10)
plt.title('Monte Carlo Method')
plt.xlabel("x")
plt.ylabel("y")
plt.show()
これを実行したら一旦パソコンから離れて散歩でもしましょう。帰ってきた頃には処理が終わっているはずです。
グラフを正方形にすればより分かりやすいですが、綺麗に弧を描いて分布しているのが分かります。
これを計算したからといって何か生まれるわけでもありませんが、興味を持った方は試していただけると嬉しいです。