モンテカルロ法でなぜ円周率が求められるのか?ランダムな点からπを推定する仕組み

モンテカルロ法でなぜ円周率が求められるのか?ランダムな点からπを推定する仕組み

円周率 π といえば、

3.1415926535…

と無限に続く数字です。

円周率を求める方法はいくつもありますが、その中には少し不思議な方法があります。

それが「モンテカルロ法」です。

モンテカルロ法では、なんと正方形の中にランダムに点を打つだけで円周率を推定できます。

なぜ、ランダムな点から円周率が分かるのでしょうか。

今回は実際に動くシミュレーターを使いながら、その仕組みを見ていきます。

正方形の中に1/4の円を描く

まず、一辺が1の正方形を考えます。

その左下を中心として、半径1の円の1/4を描きます。

正方形の面積は、

1 × 1 = 1

です。

一方、半径1の円全体の面積は、

π × 1² = π

なので、その1/4の面積は、

π ÷ 4

となります。

つまり、

1/4円の面積 ÷ 正方形の面積 = π / 4

という関係になります。

ここがモンテカルロ法で円周率を求めるポイントです。

ランダムに点を打つ

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

たとえば10,000個の点をランダムに配置したとします。

点が十分にランダムに配置されていれば、

1/4円の中に入った点の割合

は、

1/4円が正方形の中で占めている面積の割合

に近づいていきます。

つまり、

円内の点 ÷ 全ての点 ≒ π / 4

です。

両辺を4倍すれば、

π ≒ 4 × 円内の点 ÷ 全ての点

となります。

これだけで円周率を推定できます。

例えば10,000個の点を打ったら

仮に10,000個の点を打ち、そのうち7,850個が円の内側に入ったとします。

すると、

4 × 7,850 ÷ 10,000 = 3.14

となります。

本当の円周率は約3.14159なので、かなり近い数字になりました。

もちろんランダムなので、毎回まったく同じ結果になるわけではありません。

点の数が少ないうちは、

3.08になったり、
3.20になったり、
3.15になったりします。

しかし、点を何万個、何十万個と増やしていくと、推定値は少しずつπに近づいていきます。

コンピューターはどうやって「円の内側」を判断するのか

今回のシミュレーターでは、横方向をx、縦方向をyとして、それぞれ0〜1の乱数を作っています。

作られた点を、

(x, y)

とします。

半径1の円では、

x² + y² ≤ 1

なら円の内側です。

逆に、

x² + y² > 1

なら円の外側です。

つまりコンピューターが行っていることは、実はとても単純です。

  1. 0〜1のランダムなxを作る
  2. 0〜1のランダムなyを作る
  3. x² + y² ≤ 1 か調べる
  4. 円の内側ならカウントする
  5. 「4 × 円内の点 ÷ 全ての点」を計算する
  6. これを何度も繰り返す

たったこれだけです。

// 試行回数
const totalPoints = 10000;

// 円の中に入った点の数
let insidePoints = 0;

for (let i = 0; i < totalPoints; i++) {

    // 1. 0〜1のランダムな x を作る
    const x = Math.random();

    // 2. 0〜1のランダムな y を作る
    const y = Math.random();

    // 3. x² + y² ≤ 1 なら円の内側
    if (x * x + y * y <= 1) {

        // 4. 円の内側ならカウントする
        insidePoints++;
    }
}

// 5. 円内の点の割合から π を推定する
const pi = 4 * insidePoints / totalPoints;

// 結果を表示
console.log("全ての点:", totalPoints);
console.log("円内の点:", insidePoints);
console.log("推定した円周率:", pi);

実際にモンテカルロ法を動かしてみる

下のシミュレーターでは、ランダムな点が次々と正方形の中に配置されます。

円の内側に入った点と、円の外側に出た点を数えながら、リアルタイムで円周率を推定します。

「開始」を押して、点の数が増えるにつれて円周率の推定値がどのように変化するか見てみてください。

最初は値が大きく動きますが、点が増えるにつれて3.14付近で安定してくるのが分かると思います。

シミュレーターには比較用として、別の数学的な方法で計算した高精度の円周率も表示しています。

モンテカルロ法による推定値との差を見ると、ランダムな点だけで少しずつπへ近づいていく様子がよく分かります。

点を増やせばすぐ正確になるわけではない

モンテカルロ法には面白い特徴があります。

点を増やせば精度は上がっていきますが、非常にゆっくりです。

一般的にモンテカルロ法の誤差は、試行回数Nに対しておおよそ、

1 / √N

のペースで小さくなります。

つまり、誤差を約1/10にしたければ、単純には約100倍の試行回数が必要になります。

そのため、モンテカルロ法は円周率を高精度に計算する方法としては効率的ではありません。

では、なぜこんな方法が重要なのでしょうか。

モンテカルロ法の本当のすごさ

円周率を計算するだけなら、もっと高速で正確なアルゴリズムがあります。

モンテカルロ法が重要なのは、

「直接計算するのが難しい問題を、ランダムな試行を大量に行うことで近似できる」

という考え方にあります。

この考え方は、

金融商品の価格計算、
物理シミュレーション、
統計学、
AI・機械学習、
リスク分析、
工学、
ゲーム

など、非常に多くの分野で利用されています。

円周率の計算は、モンテカルロ法の考え方を視覚的に理解するための、とても分かりやすい例なのです。

まとめ

モンテカルロ法で円周率を求められる理由は、

「ランダムな点が円の中に入る確率が、円と正方形の面積比に近づくから」

です。

今回の場合、

円内の点 ÷ 全ての点 ≒ π / 4

なので、

π ≒ 4 × 円内の点 ÷ 全ての点

と計算できます。

円周を測っているわけでも、3.14という数字をあらかじめ知っているわけでもありません。

ただランダムに点を打って、その数を数えているだけです。

それでも試行回数を増やしていけば、自然と3.14159…へ近づいていきます。

確率と幾何学がつながって円周率が現れるところが、モンテカルロ法の面白さではないでしょうか。