カテゴリー
IT programming

ベルトランのパラドックスがよく理解できるJavascriptシミュレーターの作成

2020/10/25更新
シミュレータに重大なバグが有りましたので修正いたしました。
表示される確率が、Case1とCase2で逆でした(致命的ミスで申し訳ございません)。

ベルトランのパラドクス(ベルトランの逆説)というものがあります。超簡潔に言えば「ランダム」ってなんだ?という「確率の定義」に関する話です。今回はJavascriptでシミュレータを作りました。

ベルトランのパラドックスとは

とある円とそれに内接する正三角形がある。この円のランダムに弦を引いたとき、弦が正三角形の1辺よりも、長くなる確率はいくらか。

   ベルトランの逆説

という問題がベルトランのパラドクス(ベルトランの逆説 / Bertrand paradox)です。

結論から言うと、答えは3つあり、「ランダムな弦の引き方」によって、1/21/31/4、というものです。

一体どの答えが正解なのか・・・ということです。

3つの答えについて

case:1 (答えが1/3になる考え方)

The “random endpoints” method:

円周上に、ランダムに位置する2点を定め、弦を引く場合。この場合に答えが1/3になる。

ベルトランの逆説

case:2 (答えが1/2になる考え方)

The “random radial point” method:

円の半径をランダムに選んで、その半径上にランダムで点(つまり極座標でいうところの、rθがランダム)を定め、その点を通り、半径に垂直な弦を引く場合。この場合に答えが1/2になる。

ベルトランの逆説

case:3 (答えが1/4になる考え方)

The “random midpoint” method:

円の内部にランダムに点を定め、その点が中点となるような弦を引く場合。この場合に答えが1/4になる。

ベルトランの逆説

理論的になぜそうなるのか

理論的な計算方法やその解説はベルトランの逆説 – Wikipedia等のわかりやすいサイトでご確認ください!

実際にそうなるのか

Javacriptシミュレーター

というわけで、実際に上記3パターンでプログラムを組んだ場合に、本当にそのとおりの確率になるのか調べるためにプログラムをJavascriptで作りました。

https://1-10000th.com/bertrand_paradox/

使い方・仕様

ランダムな弦の数、アニメーション速度、弦の太さ、弦の中点の点の半径、各種カラーを設定して、スタートを押します。スマホにも対応しています。

著作権とか

授業とかで自由に使っていただいて結構です(ただし、デバッグはあまりしていません)。コメントいただけると私が喜びます。

結果 | Case1: The “random endpoints” method

弦を2000本Case1の方法でランダムに引いた結果です。0.33350という数字が確率です。

左の円が弦を表示、右の円が弦の中点をプロットしたものです。

結果 | Case2: The “random radial point” method

弦を2000本Case2の方法でランダムに引いた結果です。0.50850という数字が確率です。

左の円が弦を表示、右の円が弦の中点をプロットしたものです。

結果 | Case3: The “random midpoint” method

弦を2000本Case3の方法でランダムに引いた結果です。0.24000という数字が確率です。

左の円が弦を表示、右の円が弦の中点をプロットしたものです。

結果の比較

全部一気に表示すると上記になりました。

学問的な考察は省略しますが、図に注目してもらうと、円に「ランダムに弦を引く」という目的に対し、それぞれ偏りがあることがあることがわかると思います。

ぜひ、シミュレータページで試してください。

まとめ

ものすごく大雑把に言うと、「ランダムに弦を引く」という問題は、実は問題として曖昧(学問的に言うと「確率空間の定義が曖昧」)で、場合によっては確率は変わってしまいますよ。ですから確率を見るときは、場合によってはちゃんと条件(確率空間)を確認してね!ということです。おそらく!

ちなみに、ベルトランの逆説 – Wikipediaにによれば、後にジェインズさんという頭の良い方が、「拡大縮小と移動の両方に関しての不変性を考えると、これの答えはCase2だよ!」という論文が出たそうです。ご興味があれば調べてみたら面白いかも。

Javascriptのソースコードの説明はまた機会があったら。