ふと思い立ってモンテカルロ法を利用した円周率を計算するプログラムをPythonで書いてみました.
実行環境はGoogle Colabです.プログラミングの教本でよく紹介されている1辺が1の正方形に点をランダムにプロットし,プロットした点が半径1の4分円内に入るかどうかを利用した方法で計算しました.実行時間を計測しています.
import random
import time
start = time.perf_counter()
n = 0
# 試行回数の指定
total = 1000
sum = 0
def circle(x, y):
if x * x + y * y <= 1:
return 1
else:
return 0
while n < total:
x = random.random()
y = random.random()
sum += circle(x, y)
n += 1
pi = sum / total * 4
print(f"円周率: {pi}")
end = time.perf_counter()
print(f"実行時間: {end - start}")
もっと鮮やかな方法もあるのかもしれませんが,泥臭く計算させています.
試行回数10回から10億回までの実行結果が以下になります.
| 試行回数 | 計算結果 | 実行時間 [sec] |
| 10 | 3.6 | 0.000309936 |
| 100 | 3.2 | 0.000280948 |
| 1,000 | 3.104 | 0.001945798 |
| 10,000 | 3.1424 | 0.005468485 |
| 100,000 | 3.13724 | 0.054011143 |
| 1,000,000 | 3.139724 | 0.535772979 |
| 10,000,000 | 3.1416548 | 5.213728351 |
| 100,000,000 | 3.14138856 | 51.567647936 |
| 1,000,000,000 | 3.141565148 | 523.005331118 |
より厳密には,乱数の発生の一様性とか浮動小数点とかに気をつけたほうが良いのかもしれませんが,思いつきの暇つぶしなのでご勘弁ください.
実行時間は1万回あたりから線形に増えていきます.これ以上は時間がかかりすぎるな,と思いましたのでやめました.Google Colabを使えば,スペックが不足するパソコンでも簡単にプログラミングできて良いですね.