見出し画像

大数の法則を数値シミュレーションで確かめよう〜「数学ガール 確率の冒険」研究問題1-1

前々回前回の記事で、結城浩先生の「数学ガールの秘密ノート 確率の冒険」の研究問題1-1について書きました。問題と、Rによる解決についてはそれらをお読みいただくとして、今回は、Javascriptとp5.jsライブラリを使った、「数値シミュレーション+アニメーション」による解決です。


数値シミュレーション

数値シミュレーションとは、乱数をたくさん発生させることで、確率的な出来事を視覚的に理解しようという試みです。

前回の記事では、「確率0.5で1、確率1-0.5で0になるような乱数」を大量に発生させてシミュレーションを行いました。こうすると、

  • 乱数の数が少ないときには、やけに1が0より多く出たり、その逆になったりして、「ほんとに確率0.5なんか?」と思ってしまう。

  • が、乱数の数が多くなると(2000くらいを超えるとおおむね)、全体の50%で1になり、残りの50%で0になり、「なるほど確率0.5だね」と思えるような結果になってくる。

という現象を視覚化することができました。

数値シミュレーション+アニメーション

これを、アニメーション表示してしまおう、ということを、このごろ試行しております。どういうことかというと、

  1. 乱数をまず1つ発生させる。

  2. 「アニメーション表示」する

    1. 値が1だったか0だったかを、コインの裏表のような画像で表示する。

    2. 表の出た割合をグラフで表示する。

  3. 2つ目、3つ目、、、、の乱数を発生させて、「アニメーション表示」を繰り返す。

ということをするのです。そうすると、「わあ、最初のほうは1ばかり出た!」「あ、0が追いついてきた!」「あれ、今度は0の方が多いぞ」「おお、1が追いついた!」「ああ、だいたい同じになってきたなあ〜。」みたいな感じで、「ああ、やっぱり乱数の数が多くなると、ちゃんと確率通りの割合になってくるんだなあ〜」ということを実感してもらおうということです。

体験できるページはこちら

でも、そんなアニメーションどうやって作れるの? はい、私が作りました。みなさんは体験してください。

リンクを開くと、「設定と実行」という画面が出ていますが、とりあえず、何も考えず、「実行」ボタンを押してみてください! 下の画面のように、勝手にアニメーションが始まります!

とりあえず「実行」を押しましょう!

いちおう説明しますと。

  • 青い円と赤い円は、コイン投げの結果表(1=赤)が出たか、裏(0=青)が出たかを示しています。薄く表示されているところは、すでにグラフに表示し終えたコイン投げの結果で、色がはっきりしているところが、401回目から412回目の結果です。

  • グラフは、1回目から412回目までの、「表が出た割合」を表しています。「0」から出発しているので、1回目は裏が出たのでしょうね。そのあと、100回目ぐらいからは表がちょっと多い感じで推移しています。

  • もうちょっとちゃんと数値を見たいよ!という方は、数値表示の方を見てください。412回目までで、表は218回出ていて、その割合は0.529と表示されています。(500回目まで終わったところで、割合は0.526でした)

え? 「ぴったり0.5にならないじゃないか!」ですって? 当然です。ただのシミュレーションですからね。しかもたった500回ですからね。ぴったり0.5になるほうが奇跡です。(開き直る)

リセットして何回も試してみよう

「実行」ボタンの右に「リセット」ボタンがあります。クリックすると、ページをリロードしますから、また最初からできます。設定できる項目についても書いておきましょう。

  • 「コイン投げをする回数」:さっき、乱数の数が多いほど確率どおりの割合に近づくという話をしました。実は、500回ではちょっと少なすぎるのですね。数値の入力ボックスは、2000まで数が増やせますから、好きな数に変えてみてください。

  • 「表の出る確率」:フェアなコインは表が出る確率=0.5ですが、確率をわざとかえて、インチキな(仮想)コインで試すことができます。たとえば、確率を0.8にすれば、ちゃんと表が出る割合も0.8に近づいていきます。本当か? と思われた方はぜひ試してみてください。ここは、0.1〜0.9の範囲で好きな数に変えることができます。

機能改善or追加提案はありませんか?

説明は以上です。遊んでみてください。

あと、もしよろしければ、「こんなふうにしてほしい」「ここが今ひとつ」みたいなコメントをお寄せいただけると嬉しいです。
単純なところでは、「コイン投げ10000回くらいできてほしい」とか、「生成した乱数のデータがほしい」とか(この2つは割と簡単に実装できます)。
あとは、Rで実験したときのように、「2〜3人でいっしょにやっているみたいになると楽しそう!」とか(これはちょい難しい気がする)。
できそうなアイデアは、もしかしたら実装するかもしれません(約束はしません。悪しからず)。