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

> モンテカルロ法とは、乱数を使ってたくさん試し、知りたい値をだいたい推測する方法です。本記事では、基本の手順、ランダムに点を打って円周率を求める実験、誤差が1/√nで減る精度の話、リスク分析やAIでの使われ方を、図とPythonのコードで分かりやすく解説します！

- URL: https://toukei-lab.com/monte-carlo
- 公開: 2026.10.28
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、「モンテカルロ法（モンテカルロシミュレーション）」について分かりやすく解説していきます！ランダムに点を打つだけで円周率が求まる実験から、精度の話、実際に使われる場面まで見ていきましょう！
:::

こんにちは！ウマたんです！

円周率は「3.14…」と、学校で習いましたよね。

では、もし円周率の公式も値も知らなかったとしたら、どうやって求めればいいでしょうか？

実は、<mark>紙の上にでたらめに点を打って数えるだけで、円周率をかなり正確に求められる</mark>んです。

この「でたらめに、たくさん試す」ことで答えに迫る方法が、今回のテーマ「**モンテカルロ法**」です。

:::talk{who="man" side="left"}
モンテカルロ法って、データサイエンスの本でよく見るけど、何をしているのかよく分からない…
:::

:::talk{who="woman"}
ランダムに試すだけで、本当に正しい答えに近づくの？
:::

本記事では、次の5つを順番に解説していきます。

:::point
**・モンテカルロ法とは？**\
**・モンテカルロ法の基本の手順**\
**・モンテカルロ法で円周率を求めてみよう**\
**・モンテカルロ法はどれくらい正確？**\
**・モンテカルロ法が使われる場面**
:::

以下のYouTube動画でも解説していますので、あわせてチェックしてみてください！

::youtube{#Njg237BYR8U}

## モンテカルロ法とは？

**モンテカルロ法とは、乱数を使ってランダムにたくさん試し、知りたい値をだいたい推測する方法**です。

シミュレーションの形で使うことが多いので、「**モンテカルロシミュレーション**」とも呼ばれます。

世の中には、計算が難しすぎて、正確な式で答えを出すのが大変な問題がたくさんあります。

そんなときでも、サイコロや乱数を使ったシミュレーションを何度も何度も繰り返すと、答えの近くにどんどん迫っていけるんです！

| | 正確な式で解く | モンテカルロ法 |
|---|---|---|
| やり方 | 数式を組み立てて、計算で答えを出す | 乱数でたくさん試して、結果の平均や割合を取る |
| 答え | ぴったりの値 | だいたいの値（回数を増やすほど正確になる） |
| 向いている問題 | 式で表せる、シンプルな問題 | 式にするのが難しい、複雑な問題 |
| 必要なもの | 数学の知識 | 計算の回数（コンピューターの力） |

<mark>式が分からなくても、コンピューターに「たくさん試してもらう」ことで答えを出せる</mark>。

これがモンテカルロ法の一番の強みなんです！

### 名前の由来はモナコのカジノ

「モンテカルロ」は、モナコ公国にある地区の名前です。

カジノで有名な街で、サイコロやルーレットのような「ランダム性」を連想させることから、この名前がつきました。

1940年代に、数学者のスタニスワフ・ウラム氏やジョン・フォン・ノイマン氏らが、研究の中でこの方法を使い始めたのが始まりとされています。

ちょうどコンピューターが登場したころで、「人の手では無理な回数の試行も、コンピューターならできる」という時代の流れとぴったり合っていたんですね。

## モンテカルロ法の基本の手順

モンテカルロ法の基本は、とてもシンプルです。

:::box{title="モンテカルロ法の3つのステップ"}
**①** ランダムに乱数を作る\
**②** その乱数を使ってシミュレーションをする\
**③** たくさん繰り返して、結果の平均（割合）を取る
:::

これだけで、だいたいの答えが分かるんです。

そして、<mark>繰り返す回数が増えるほど、答えは本物に近づいていきます</mark>。

これは、統計学の「**大数の法則**」という性質に支えられています。

たくさん試せば試すほど、試した結果の平均は、本当の値に近づいていく、という法則です。

<https://toukei-lab.com/large-numbers>

### 例：サイコロ2個の合計が7になる確率

かんたんな例で考えてみましょう。

サイコロを2個振ったとき、合計が7になる確率はいくつでしょうか？

計算で求めると、目の出方は全部で $6 \times 6 = 36$ 通り。

そのうち合計が7になるのは、(1, 6)・(2, 5)・(3, 4)・(4, 3)・(5, 2)・(6, 1) の6通りなので、確率は $\frac{6}{36} = \frac{1}{6}$ です。

でも、もしこの計算のしかたを知らなかったとしても大丈夫。

実際に何回もサイコロを振って、「合計が7になった回数の割合」を数えれば、だいたい1/6に近づくはずです。

Pythonで、サイコロ2個を10万回振るシミュレーションをしてみましょう。

```python
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}")
```

```text
シミュレーション：0.1667
計算で出した答え：0.1667
```

計算で出した1/6（約0.1667）と、ほぼぴったり一致しましたね！

<mark>正確な式を知らなくても、ランダムに試して割合を取るだけで、答えに近づける</mark>。

まさにこのアプローチが、モンテカルロ法なんです。

## モンテカルロ法で円周率を求めてみよう

モンテカルロ法の例として特に有名なのが、**円周率πを求める実験**です。

冒頭の「でたらめに点を打つだけで円周率が求まる」という話ですね。

### 正方形と円の面積の比を使う

まず、1辺の長さが1の正方形を用意します。

その中に、半径1の円の4分の1（扇形）を描きます。

:::box{title="面積をくらべると"}
**・正方形の面積**：$1 \times 1 = 1$\
**・円の4分の1の面積**：$\pi \times 1^2 \div 4 = \frac{\pi}{4}$
:::

この正方形の中に、ランダムに点をたくさん打っていきます。

点は正方形のどこにでも同じくらいの出やすさで落ちるので、円の中に入る点の割合は、面積の比 $\frac{\pi}{4}$ に近づいていくはずです。

$$
\frac{\text{円の中に入った点の数}}{\text{打った点の数}} \approx \frac{\pi}{4}
$$

つまり、<mark>円の中に入った点の割合を4倍すれば、円周率πが推定できる</mark>んです！

点 $(x, y)$ が円の中に入っているかどうかは、原点からの距離が1以下か、つまり $x^2 + y^2 \leq 1$ かどうかで判定できます。

実際に点を100個、1,000個、10,000個と打ってみると、こんな感じになります。

![正方形の中にランダムに点を打ち、円の中に入った点（青緑）の割合を4倍すると、円周率の推定値になる](/wp-content/uploads/2026/10/monte-carlo-pi.jpg)

点の数が少ないうちは3.12や3.17のようにずれていますが、点を増やすと本当の円周率（3.14159…）に近づいていきますね。

### Pythonで実装してみよう

このモンテカルロ法で円周率を求めるアプローチは、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}")
```

```text
      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の間のどの値も同じくらいの出やすさで出てくる乱数です。このような分布は「**一様分布**」と呼ばれます。

<https://toukei-lab.com/uniform>

点を1個ずつ増やしながら、推定値がどう変わっていくかをグラフにすると、次のようになります。

![点を増やすほど、円周率の推定値は本当の値（点線）に近づいていく。青緑の線と灰色の線は、乱数を変えて試した結果](/wp-content/uploads/2026/10/monte-carlo-convergence.jpg)

はじめのうちは大きく上下にぶれていますが、点が増えるにつれて、どの線も本当の円周率のまわりに落ち着いていきます。

<mark>回数を増やせば増やすほど、ランダムなぶれが打ち消し合って、本物の値に近づいていく</mark>んです！

## モンテカルロ法はどれくらい正確？

では、モンテカルロ法はどれくらい正確なのでしょうか？

もちろん、試す回数を増やせば増やすほど正確になります。

### 誤差は「1/√n」のペースで小さくなる

具体的には、<mark>モンテカルロ法の誤差は、だいたい $\frac{1}{\sqrt{n}}$ のペースで小さくなっていきます</mark>（$n$ は試す回数）。

$$
\text{誤差} \propto \frac{1}{\sqrt{n}}
$$

たとえば、$n = 1{,}000$ 回から $n = 10{,}000$ 回に増やすと、誤差は約 $\frac{1}{\sqrt{10}}$、つまり約3.16分の1に小さくなります。

逆に言うと、<mark>誤差を10分の1にしたかったら、100倍の回数を試す必要がある</mark>んです。

実際に、円周率の実験をそれぞれの回数で300回ずつくり返して、誤差の平均を調べてみました。

![回数を100倍にするたびに、誤差はおよそ10分の1になっている（両方の軸が対数目盛り）](/wp-content/uploads/2026/10/monte-carlo-error.jpg)

| 打った点の数 | 誤差の平均 |
|---|---|
| 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」という性質から、モンテカルロ法の強みと弱みが見えてきます。

:::good
**・式が分からなくても、試すだけで答えに近づける**\
**・変数（次元）がたくさんある問題でも、誤差が減るペース（1/√n）は変わらない**\
**・考え方がシンプルで、コードも短く書ける**
:::

:::warn
**・精度を上げるには、回数を大きく増やす必要がある（10倍正確にするには100倍の計算）**\
**・乱数を使うので、実行するたびに結果が少し変わる（乱数の種を決めれば再現できる）**\
**・得られるのは「だいたいの値」なので、どれくらいずれていそうかも合わせて考える**
:::

特に2つ目の強みは大事です。

変数がたくさんある問題では、マス目のように細かく区切って計算するやり方だと、区切りの数が爆発的に増えてしまいます。

モンテカルロ法なら、変数が増えても誤差の減るペースは同じなので、<mark>複雑で変数の多い問題ほど、モンテカルロ法の出番が増える</mark>んです！

## モンテカルロ法が使われる場面

それでは、現実の世界では、モンテカルロ法をどんな場面で使うのでしょうか？

大きく分けると、次の3つの場面で活躍します。

:::box{title="モンテカルロ法が使われる3つの場面"}
**・面積や確率を求めたいけど、式で計算するのが難しいとき**\
**・株価の変動や在庫切れの確率など、将来のリスクを知りたいとき**\
**・待ち行列や交通渋滞など、複雑な仕組みを試しながら理解したいとき**
:::

### 将来のリスクを見積もる

たとえば、お店の在庫を考えてみましょう。

毎日のお客さんの数はばらつくので、「明日の在庫が足りなくなる確率」を式でぴったり出すのは大変です。

そこで、過去のデータをもとに「1日のお客さんの数」を乱数で作り、1万日分のシミュレーションをします。

そのうち在庫切れになった日の割合を数えれば、在庫切れの確率がだいたい分かるわけです。

| 分野 | モンテカルロ法の使い方の例 |
|---|---|
| 金融・投資 | 株価がランダムに動くとしてたくさんの未来を作り、損失がどれくらい出そうかを見積もる |
| 小売・物流 | お客さんの数をばらつかせて、在庫切れが起きる確率を調べる |
| 交通・サービス | 車や人の到着をランダムに起こして、渋滞や待ち時間の長さを調べる |
| 製造・品質 | 部品の寸法のばらつきを乱数で再現して、不良品が出る割合を調べる |
| 物理・工学 | 粒子の動きをランダムに追いかけて、複雑な現象を再現する |

<mark>「ばらつき」があるものをたくさん再現して、起こりうる未来をまとめて眺められる</mark>のが、モンテカルロ法の強みなんです。

### AIや統計学の中でも活躍している

モンテカルロ法は、AIや統計学の世界でもあちこちで使われています。

たとえば、2016年にトップ棋士に勝って話題になった囲碁AI「**AlphaGo**」は、「**モンテカルロ木探索**」という方法を使っていました。

先の展開をランダムにたくさん試して、どの手が勝ちにつながりやすいかを見積もる方法です。

また、強化学習でも、実際に最後までプレイしてみた結果の平均から「その状態がどれくらい良いか」を見積もるモンテカルロ法が、基本の手法として登場します。

強化学習については、以下の記事で解説しています。

<https://toukei-lab.com/reinforcement-learning>

ほかにも、ベイズ統計学では「**MCMC（マルコフ連鎖モンテカルロ法）**」という方法で、計算の難しい分布から乱数を取り出して推定を行います。

| 分野 | モンテカルロ法の考え方が使われているもの |
|---|---|
| ゲームAI | モンテカルロ木探索（AlphaGoなど） |
| 強化学習 | プレイした結果の平均から、状態や行動の良さを見積もる |
| ベイズ統計学 | MCMC（マルコフ連鎖モンテカルロ法） |
| 統計の検証 | 乱数でデータを作って、分析の方法がうまく働くかを確かめる |

複雑な問題に対して、大量の乱数でシミュレーションして、だいたいの値を推定する。

<mark>このアプローチは非常に役に立つので、ぜひ覚えておきましょう！</mark>

## モンテカルロ法のまとめ

最後に、今回のポイントをおさらいしましょう！

:::point
**・モンテカルロ法は、乱数でランダムにたくさん試して、知りたい値をだいたい推測する方法**\
**・手順は「乱数を作る → シミュレーションする → たくさん繰り返して平均（割合）を取る」の3つ**\
**・正方形にランダムに点を打ち、円に入った割合を4倍すると、円周率が求まる**\
**・誤差は1/√nのペースで減るので、10倍正確にするには100倍の回数が必要**\
**・リスクの見積もりや待ち行列、囲碁AIやベイズ統計学など、幅広い場面で使われている**
:::

:::talk{who="umatan"}
要は、「式で解けないなら、たくさん試して数えればいい」という発想なんです！ぜひPythonで点を打って、円周率が近づいていく様子を自分の目で確かめてみてください！
:::

統計学やデータサイエンスを体系的に学びたいのであれば、当メディアが運営するスクール「**[スタアカ](https://toukei-lab.com/achademy/)**」がオススメです！

:::box
**[業界最安級のAIデータサイエンス特化スクール「スタアカ」](https://toukei-lab.com/achademy/)**
:::