3.14159265 ...
3月14日は円周率の日というそうです。1時59分 もしくは 15時9分にお祝いするのだそうな。特に、3/14/1592 6:53.58(1592年3月14日6時53分58秒)は、円周率の上12桁に一致するため、究極の円周率の日といわれているそうです。
さて、先日、知人とお酒を飲んでいるときに、なぜか『今から円周率を求めてみよう』となり、その場でiPhone/Pythonista 3 (Python3)を使いながらプログラミングしてみました。酔っていても、意外とできるものです。インターネットを調べていると円周率を求める方法は様々あることがわかり、そのうち2つを試してみました。どちらの方法でも3.14付近の数値が求められます。
直交座標系のモンテカルロ法
まずは、縦0~1、横0~1の正方形の中にランダムでボールを落としていって、原点からの距離が1.0以内である確率を求め、それを四分円の面積と見て円周率を求める方法です。
# 直交座標系のモンテカルロ法
import random
N= 1000000
point = 0
for i in range(N):
x = random.random()
y = random.random()
r = (x*x + y*y)
if r < 1 :
point = point +1
pi = 4.0 * point / N
print(pi)
極座標系のモンテカルロ法 ~ ビュフォンの針
x/yの直交座標系ではなく、r/θの極座標系のモンテカルロ法でも円周率を求められるようです。等間隔に直線を引いた紙の上に、その感覚と同じ長さの針を投げて、針と線が触れる確率から円周率を求められるそうです。この発想が凄い!ですが、その説明が私には難しいので、こちらのサイトを参考に・・・プログラムだけは書いてみました。
# 極座標系のモンテカルロ法 ~ ビュフォンの針
import math
import random
N= 1000000
point = 0
for i in range(N) :
r = random.random()
theta = random.random() * 360
if 0 > r - math.sin(math.radians(theta)) :
point = point + 1
pi = N / point
print(pi)
これは面白いですね。ちなみに、本稿の投稿日は2019年3月14日です。
それでは、良い円周率の日を!