学校で習う 円周率(π)= 3.14... は、紀元前から人類が研究してきた不思議な数。今回は、これを自分のパソコンで「実験」して見つけます。100万個の点を画面にランダムに打つだけで、3.14が現れるよ。
「モンテカルロ法( method)」は、1940年代にアメリカの研究所(ロスアラモス国立研究所)で、数学者の スタニスワフ・ウラム と ジョン・フォン・ノイマン が考案した手法。最初は核兵器開発の研究で「中性子の動きをサイコロのように確率で計算する」ために使われた。名前の「モンテカルロ」は、モナコ公国にある有名なカジノの街から取られたんだ(ウラムさんのおじさんがそこでよくギャンブルをしていた)。今では、円周率の計算だけでなく、ゲームAIの強化学習・金融商品の価格予測・天気予報など、世界中で使われている計算方法になっているよ。
考え方:モンテカルロ法
1辺が2の正方形の中に、半径1の円があるとします。正方形の中にランダムに点をたくさん打ったとき、円の中に入った点の割合は、円の面積 ÷ 正方形の面積 になるはず。
計算すると:
- 正方形の面積 = 2 × 2 = 4
- 円の面積 = π × 半径² = π × 1 = π
- 点の割合 = π ÷ 4
- つまり π = 点の割合 × 4 で求まる
実装: で実験
import random
# 円の中に入った点の数inside = 0total = 1000000 # 100万個の点
for i in range(total): x = random.uniform(-1, 1) # -1 から 1 までのランダムな数 y = random.uniform(-1, 1)
# 中心(0,0)からの距離が1以下なら、円の中 if x * x + y * y <= 1: inside += 1
# πを計算pi_estimate = 4 * inside / totalprint("予想したπ:", pi_estimate)▶ 実行ボタンを押す(だいたい3秒くらいかかる)予想したπ: 3.141383.14が出てきた! 100万個の点をランダムに打っただけなのに、本当のπ(3.14159...)にとても近い。

Step 2: 点が増えるほど正確になるのを見る
import randomimport matplotlib.pyplot as plt
results = []sizes = [100, 1000, 10000, 100000, 1000000]
for total in sizes: inside = 0 for i in range(total): x = random.uniform(-1, 1) y = random.uniform(-1, 1) if x * x + y * y <= 1: inside += 1 pi_estimate = 4 * inside / total results.append(pi_estimate) print(total, "個 →", pi_estimate)
# グラフに描くplt.plot(sizes, results, marker="o")plt.axhline(3.14159, color="red", linestyle="--", label="本当のπ")plt.xscale("log")plt.xlabel("点の数")plt.ylabel("予想したπ")plt.legend()plt.show()
点が少ないとガタガタしてるけど、100万個も打つとほぼ3.14に張り付くよ。これが「たくさんやれば正確になる」という確率の不思議。
Step 3: 点を絵にしてみる
実際に点を絵にしてみたい子は、これを実行してみよう(重いので1万点だけ):
import randomimport matplotlib.pyplot as plt
inside_x, inside_y, outside_x, outside_y = [], [], [], []
for i in range(10000): x = random.uniform(-1, 1) y = random.uniform(-1, 1) if x * x + y * y <= 1: inside_x.append(x) inside_y.append(y) else: outside_x.append(x) outside_y.append(y)
plt.figure(figsize=(6, 6))plt.scatter(inside_x, inside_y, s=1, c="orange", label="中")plt.scatter(outside_x, outside_y, s=1, c="gray", label="外")plt.legend()plt.title(f"π ≒ {4 * len(inside_x) / 10000}")plt.show()やってみよう
- 点を1億個に増やすと、もっと正確になる?(時間はかかる)
- 乱数の種を `random.seed(42)` で固定すると、毎回同じ結果になるのを確認
- 正方形の中に四角形を描いて、その面積も同じやり方で求めてみる
モンテカルロ法は、確率と幾何の橋渡しに最適な題材です。「πは円周÷直径で定義される定数」を「ランダム実験で出せる」という発見は、確率的思考の入口として強烈な体験になります。中学校以降の確率分布の理解にもつながります。
次回予告
次回は、ボールを画面で跳ねさせて遊びます。重力って何だろう?月や火星でも跳ねさせられる!
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。