プログラミングで求める!それでは上の考えをプログラミングします。\dots$$だそうです。今回はこれを模範解答として、プログラミングで得られた円周率の精度を評価してみましょう。扇の中か外かの判定は?プログラミングをする上で、あと1つ問題が残っています。それは打たれた点が「扇の中か外かを判定する計算」をどう実現するか?という問題です。先に答えを言ってしまうと、これは中3の「三平方の定理」で解決します。上のように点が打たれたとします。これが円の半径1よりも小さければ扇形の内部というワケです。使っても、1以上か未満かの判定には影響しません。計算を楽にしてあげた方がコンピューターから高速に結果を得られます。と1を比べて判定します。さぁ、今度こそプログラミングです。私が高校生の時に経験したBASICというプログラミング言語で再現してみます。BASICのプログラミング半径1の図をそのまま描くと小さすぎて何も見えなくなるので、400倍に拡大して描画するようにプログラミングしています。(4*COUNT/N)このプログラムを使って、針を落とす実験の回数を10000回まで実行したのが下の図です。この1万回の実験で、だいたい6秒くらいかかりました。扇形は青い線で、針の落ちた場所が赤い点です。円周率が3.132と出ています。残念ながら1万回の実験をもってしても小数第1位くらいまでしか求まらなかったようです。そこで10万回に増やしてみました。今度は60秒くらいかかりました。10万個も点を打つと、かなり塗りつぶされている感じになります。円周率が3.1404と出ています。10万回でお馴染みの「3.14」つまり小数第2位まで求められました。こりゃ、とてもじゃないけど、人間の手で実験なんてしていられませんね。Pythonのプログラミング今度は同じことを「Python(パイソン)」というプログラミング言語で実行しました。下がそのプログラムです。BASICよりも高速に動作するので、10万回を超えるような計算はPythonの方で実験することにします。グラフィックは面倒なので省略します。その代わり計算にかかった時間を表示するようにしました。(t.time()-start)))cal_pai(100)cal_pai(1000)cal_pai(10000)cal_pai(100000)cal_pai(1000000)cal_pai(10000000)cal_pai(100000000)cal_pai(1000000000)実行結果が下の図です。私のパソコンでは1億回の計算に21秒くらい、10億回の計算に4分12秒くらいかかりました。10万回で「3.14」まで求まるようですね。1億回で小数第3位の3.141まで求まっています。10億回に増やしても小数第4位まで出すことができませんでした。本当は3.1415...と表示されて欲しいのですが、3.1416...となっています。そこで100億回にチャレンジしてみたいところですが、そうすると1時間くらいかかりそうなので止めておきます。Scratch(スクラッチ)のプログラミング最後にスクラッチのプログラミングです。スクラッチは計算が遅いので、このように何千万回も計算をするような処理には向きません。プログラムは読みやすいです。実行してみると100万回で小数第2位の3.14まで求まりました。かかった時間は3秒弱でした。意外と速いですね!同じ100万回で見ると、Pythonは約0.22秒、BASICは約600秒ですから、スクラッチの計算速度はBASICの200倍、Pythonの$\frac{1}{13}$くらいの速さということになりました。今回のBASICはエミュレーター上で動作し、なおかつグラフ表示もしているため遅いのは仕方がありません。スクラッチは簡単にプログラミングできる環境でありながら、立派にアルゴリズムをプログラミングして実験できる環境だと言えます。小学生が初めてプログラミングする環境として「スクラッチが最強」であることが、あらためて実感できました。弱点を補うのもプログラミングスクラッチにも弱点はあります。今回のプログラムに関しては次の2つです。小数の乱数を生み出す命令が無い「以上」「以下」を表す演算子が無い(「より大きい」「より小さい」しかない)この2つの弱点を補うために、それぞれ次のような工夫しています。「0~1000の範囲」で整数の乱数を生成し、それを1000で割って小数にした「1以下のとき」の条件が作れないので、代わりに「「1より大きい」でないとき」としたみなさんならどのように工夫しますか?有るもので工夫するのもプログラミング的思考の大切なポイントです。奥が深い分野モンテカルロ法は奥がとても深くて、大学の卒業論文などでもよく取り上げられる問題です。奥が深いとは、例えば、実際に実験することを想像すればわかります。実際に実験するときには、先に実験の目的を決めますよね。今回なら「円周率を小数第何位まで求めたいか?」ということを決めます。仮に、これが世界で初めての実験だったとしましょう。「その桁まで求めるには、何回くらい実験する必要があるのか?」ということが分かっていなければ、実験を終わらせることができません。世界で初めて実験するのですから、まだ誰も円周率の小数第4位の数を知りません。正解が分かっていません。答え合わせができない!というのが、この実験の難しいところなのです。そこで代わりに「何回目の実験で正解にたどり着けるのか?」を何らかの方法で求めておく必要があります。それが分かっていなければ、いつまでもゴールできません。永遠に実験をし続ける羽目になってしまいますから。この「実験を終えてよい回数」を求める方法は、実はとても難しい理論になります。大学の数学レベルの話になってしまいます。上の実験では、Pythonで10億回やっても小数第4位を正しく出せんでした。実際の実験では、そもそも「正しく出なかった」という判断ができません。今回は先に円周率の正解を表示するという「ズル」をしていたので「まだ求まっていない」という判断ができた、というワケです。円周率の小数第4位の数。100億回なら出るのでしょうか?もしかしたら1000億回なのでしょうか?こういうたいへんな作業をやる前に、先に「何回やったら終わっていいよ。」という回数を知っておきたいですね。大学受験の範囲を超えてしまいますが、興味のある人は調べてみてください。暇な時間を上手に使える人に成ろう高校受験や大学受験を終えた皆さんが、暇つぶしをするネタとして、今回はモンテカルロ法で円周率を求めるプログラミングを提供してみました。塾長の過去の思い出から、たまたま思い出したので書いてみました。コンピューターを使った遊び方は色々ですが、ゲームをするだけではもったいないです。コンピューターが持つ本当の力を引き出してみてください。これは時間の使い方の1つの例です。みなさんは暇な時間に何をしますか?そういう時間を上手に使える人に成りたいものですね。卒塾生(進路が確定するまで在籍していた生徒)が入学した学校の一覧です。お友達登録はこちらLINE登録するとプレゼントがもらえます!【会員限定】お子様の成績と可能性を伸ばす18個のノウハウ塾関係者様のお友達登録はこちらLINE登録するとプレゼントがもらえます!「zoomで簡単。