モンテカルロ法とは?円周率の求め方や精度、使われる場面をPythonで分かりやすく解説!

目次
ウマたん当サイト【スタビジ】の本記事では、「モンテカルロ法(モンテカルロシミュレーション)」について分かりやすく解説していきます!ランダムに点を打つだけで円周率が求まる実験から、精度の話、実際に使われる場面まで見ていきましょう!
こんにちは!ウマたんです!
円周率は「3.14…」と、学校で習いましたよね。
では、もし円周率の公式も値も知らなかったとしたら、どうやって求めればいいでしょうか?
実は、紙の上にでたらめに点を打って数えるだけで、円周率をかなり正確に求められるんです。
この「でたらめに、たくさん試す」ことで答えに迫る方法が、今回のテーマ「モンテカルロ法」です。
モンテカルロ法って、データサイエンスの本でよく見るけど、何をしているのかよく分からない…
ランダムに試すだけで、本当に正しい答えに近づくの?
本記事では、次の5つを順番に解説していきます。
以下のYouTube動画でも解説していますので、あわせてチェックしてみてください!
モンテカルロ法とは?
モンテカルロ法とは、乱数を使ってランダムにたくさん試し、知りたい値をだいたい推測する方法です。
シミュレーションの形で使うことが多いので、「モンテカルロシミュレーション」とも呼ばれます。
世の中には、計算が難しすぎて、正確な式で答えを出すのが大変な問題がたくさんあります。
そんなときでも、サイコロや乱数を使ったシミュレーションを何度も何度も繰り返すと、答えの近くにどんどん迫っていけるんです!
| 正確な式で解く | モンテカルロ法 | |
|---|---|---|
| やり方 | 数式を組み立てて、計算で答えを出す | 乱数でたくさん試して、結果の平均や割合を取る |
| 答え | ぴったりの値 | だいたいの値(回数を増やすほど正確になる) |
| 向いている問題 | 式で表せる、シンプルな問題 | 式にするのが難しい、複雑な問題 |
| 必要なもの | 数学の知識 | 計算の回数(コンピューターの力) |
式が分からなくても、コンピューターに「たくさん試してもらう」ことで答えを出せる。
これがモンテカルロ法の一番の強みなんです!
名前の由来はモナコのカジノ
「モンテカルロ」は、モナコ公国にある地区の名前です。
カジノで有名な街で、サイコロやルーレットのような「ランダム性」を連想させることから、この名前がつきました。
1940年代に、数学者のスタニスワフ・ウラム氏やジョン・フォン・ノイマン氏らが、研究の中でこの方法を使い始めたのが始まりとされています。
ちょうどコンピューターが登場したころで、「人の手では無理な回数の試行も、コンピューターならできる」という時代の流れとぴったり合っていたんですね。
モンテカルロ法の基本の手順
モンテカルロ法の基本は、とてもシンプルです。
これだけで、だいたいの答えが分かるんです。
そして、繰り返す回数が増えるほど、答えは本物に近づいていきます。
これは、統計学の「大数の法則」という性質に支えられています。
たくさん試せば試すほど、試した結果の平均は、本当の値に近づいていく、という法則です。
大数の法則について分かりやすく解説しPythonで検証!中心極限定理に繋がる法則とは?当サイト【スタビジ】の本記事では、大数の法則について解説してきます。大数の法則とはサンプルサイズnが大きくなることで、標本平均は母平均に近似できる性質を指します。今回はコインの例を使いつつ、大数の法則を見ていきたいと思います!有名な中心極限定理にも繋がる大事な大数の法則をおさえておきましょう!
例:サイコロ2個の合計が7になる確率
かんたんな例で考えてみましょう。
サイコロを2個振ったとき、合計が7になる確率はいくつでしょうか?
計算で求めると、目の出方は全部で 通り。
そのうち合計が7になるのは、(1, 6)・(2, 5)・(3, 4)・(4, 3)・(5, 2)・(6, 1) の6通りなので、確率は です。
でも、もしこの計算のしかたを知らなかったとしても大丈夫。
実際に何回もサイコロを振って、「合計が7になった回数の割合」を数えれば、だいたい1/6に近づくはずです。
Pythonで、サイコロ2個を10万回振るシミュレーションをしてみましょう。
import numpy as np
rng = np.random.default_rng(0)
n = 100_000
dice1 = rng.integers(1, 7, size=n) # 1〜6の目をn回
dice2 = rng.integers(1, 7, size=n)
rate = np.mean(dice1 + dice2 == 7) # 合計が7になった割合
print(f"シミュレーション:{rate:.4f}")
print(f"計算で出した答え:{1/6:.4f}")
シミュレーション:0.1667
計算で出した答え:0.1667
計算で出した1/6(約0.1667)と、ほぼぴったり一致しましたね!
正確な式を知らなくても、ランダムに試して割合を取るだけで、答えに近づける。
まさにこのアプローチが、モンテカルロ法なんです。
モンテカルロ法で円周率を求めてみよう
モンテカルロ法の例として特に有名なのが、円周率πを求める実験です。
冒頭の「でたらめに点を打つだけで円周率が求まる」という話ですね。
正方形と円の面積の比を使う
まず、1辺の長さが1の正方形を用意します。
その中に、半径1の円の4分の1(扇形)を描きます。
この正方形の中に、ランダムに点をたくさん打っていきます。
点は正方形のどこにでも同じくらいの出やすさで落ちるので、円の中に入る点の割合は、面積の比 に近づいていくはずです。
つまり、円の中に入った点の割合を4倍すれば、円周率πが推定できるんです!
点 が円の中に入っているかどうかは、原点からの距離が1以下か、つまり かどうかで判定できます。
実際に点を100個、1,000個、10,000個と打ってみると、こんな感じになります。

点の数が少ないうちは3.12や3.17のようにずれていますが、点を増やすと本当の円周率(3.14159…)に近づいていきますね。
Pythonで実装してみよう
このモンテカルロ法で円周率を求めるアプローチは、Pythonで簡単に実装できます。
import numpy as np
rng = np.random.default_rng(0) # 乱数の種を決めておくと、毎回同じ結果になる
for n in [100, 1_000, 10_000, 100_000, 1_000_000]:
x = rng.random(n) # 0〜1の乱数をn個(点のx座標)
y = rng.random(n) # 0〜1の乱数をn個(点のy座標)
inside = (x**2 + y**2) <= 1 # 円の中に入ったかどうか
pi_est = 4 * inside.mean() # 円の中に入った割合 × 4
print(f"{n:>9,}個の点 → π ≒ {pi_est:.4f}")
100個の点 → π ≒ 2.7200
1,000個の点 → π ≒ 3.2000
10,000個の点 → π ≒ 3.1388
100,000個の点 → π ≒ 3.1442
1,000,000個の点 → π ≒ 3.1409
100個のときは2.72と大きく外れていますが、100万個まで増やすと3.1409。本当の値の3.14159…にかなり近づきました!
ここで使っている rng.random() は、0から1の間のどの値も同じくらいの出やすさで出てくる乱数です。このような分布は「一様分布」と呼ばれます。
【Python実装あり】一様分布について解説!定義と平均・分散の導出について!当サイト【スタビジ】の本記事では、一様分布について解説していきます!一様分布は代表的な離散的分布の一つでもあり、連続的分布の一つでもある基本的な分布です。今回は一様分布の定義を解説しつつ、平均・分散といった基本的な要素も解説していきます。
点を1個ずつ増やしながら、推定値がどう変わっていくかをグラフにすると、次のようになります。

はじめのうちは大きく上下にぶれていますが、点が増えるにつれて、どの線も本当の円周率のまわりに落ち着いていきます。
回数を増やせば増やすほど、ランダムなぶれが打ち消し合って、本物の値に近づいていくんです!
モンテカルロ法はどれくらい正確?
では、モンテカルロ法はどれくらい正確なのでしょうか?
もちろん、試す回数を増やせば増やすほど正確になります。
誤差は「1/√n」のペースで小さくなる
具体的には、モンテカルロ法の誤差は、だいたい のペースで小さくなっていきます( は試す回数)。
たとえば、 回から 回に増やすと、誤差は約 、つまり約3.16分の1に小さくなります。
逆に言うと、誤差を10分の1にしたかったら、100倍の回数を試す必要があるんです。
実際に、円周率の実験をそれぞれの回数で300回ずつくり返して、誤差の平均を調べてみました。

| 打った点の数 | 誤差の平均 |
|---|---|
| 10 | 約0.398 |
| 100 | 約0.130 |
| 1,000 | 約0.043 |
| 1万 | 約0.013 |
| 10万 | 約0.0043 |
10回 → 1,000回 → 10万回と、回数を100倍にするたびに、誤差がほぼ10分の1になっていますね!
モンテカルロ法の強みと弱み
この「1/√n」という性質から、モンテカルロ法の強みと弱みが見えてきます。
特に2つ目の強みは大事です。
変数がたくさんある問題では、マス目のように細かく区切って計算するやり方だと、区切りの数が爆発的に増えてしまいます。
モンテカルロ法なら、変数が増えても誤差の減るペースは同じなので、複雑で変数の多い問題ほど、モンテカルロ法の出番が増えるんです!
モンテカルロ法が使われる場面
それでは、現実の世界では、モンテカルロ法をどんな場面で使うのでしょうか?
大きく分けると、次の3つの場面で活躍します。
将来のリスクを見積もる
たとえば、お店の在庫を考えてみましょう。
毎日のお客さんの数はばらつくので、「明日の在庫が足りなくなる確率」を式でぴったり出すのは大変です。
そこで、過去のデータをもとに「1日のお客さんの数」を乱数で作り、1万日分のシミュレーションをします。
そのうち在庫切れになった日の割合を数えれば、在庫切れの確率がだいたい分かるわけです。
| 分野 | モンテカルロ法の使い方の例 |
|---|---|
| 金融・投資 | 株価がランダムに動くとしてたくさんの未来を作り、損失がどれくらい出そうかを見積もる |
| 小売・物流 | お客さんの数をばらつかせて、在庫切れが起きる確率を調べる |
| 交通・サービス | 車や人の到着をランダムに起こして、渋滞や待ち時間の長さを調べる |
| 製造・品質 | 部品の寸法のばらつきを乱数で再現して、不良品が出る割合を調べる |
| 物理・工学 | 粒子の動きをランダムに追いかけて、複雑な現象を再現する |
「ばらつき」があるものをたくさん再現して、起こりうる未来をまとめて眺められるのが、モンテカルロ法の強みなんです。
AIや統計学の中でも活躍している
モンテカルロ法は、AIや統計学の世界でもあちこちで使われています。
たとえば、2016年にトップ棋士に勝って話題になった囲碁AI「AlphaGo」は、「モンテカルロ木探索」という方法を使っていました。
先の展開をランダムにたくさん試して、どの手が勝ちにつながりやすいかを見積もる方法です。
また、強化学習でも、実際に最後までプレイしてみた結果の平均から「その状態がどれくらい良いか」を見積もるモンテカルロ法が、基本の手法として登場します。
強化学習については、以下の記事で解説しています。
強化学習を具体例と共にわかりやすく解説!Q学習をPythonで実装してみよう!当サイト【スタビジ】の本記事では、強化学習について具体例と共に解説していきます!また最終的に強化学習の中で最も一般的なアルゴリズムであるQ学習をPythonで実装していきます。迷路の最適経路を見つけるプログラムを作っていきますよ!
ほかにも、ベイズ統計学では「MCMC(マルコフ連鎖モンテカルロ法)」という方法で、計算の難しい分布から乱数を取り出して推定を行います。
| 分野 | モンテカルロ法の考え方が使われているもの |
|---|---|
| ゲームAI | モンテカルロ木探索(AlphaGoなど) |
| 強化学習 | プレイした結果の平均から、状態や行動の良さを見積もる |
| ベイズ統計学 | MCMC(マルコフ連鎖モンテカルロ法) |
| 統計の検証 | 乱数でデータを作って、分析の方法がうまく働くかを確かめる |
複雑な問題に対して、大量の乱数でシミュレーションして、だいたいの値を推定する。
このアプローチは非常に役に立つので、ぜひ覚えておきましょう!
モンテカルロ法のまとめ
最後に、今回のポイントをおさらいしましょう!
ウマたん要は、「式で解けないなら、たくさん試して数えればいい」という発想なんです!ぜひPythonで点を打って、円周率が近づいていく様子を自分の目で確かめてみてください!
統計学やデータサイエンスを体系的に学びたいのであれば、当メディアが運営するスクール「スタアカ」がオススメです!
読んだ内容を、手を動かして身につける
データサイエンス・AIを、動画と課題で体系的に学べるオンラインスクール。
スタアカを見てみる





