前回は確率の数学の言葉を一通りおさらいしました。今回はその確認に役立つ道具となるシミュレーション用ソフトウエアを作りましょう。そして完成したものを利用して、実験で得られる値と確率の数学で得られる値との間に差があるかどうかを確認してみましょう。
問題1 さいころの働きをするクラスを作りましょう
今後確率の学習を進める中で、きっと役に立つプログラムを作っておきましょう。確率の数学といえば、やっぱりさいころです。
以下に肝心の部分を省略した未完成版のコードを掲載します。コンパイル・実行は可能ですが、Diceクラスの実装が不完全ですので目的の動作をしません。Diceクラスにコードを追加して完成させてください。
さいころは任意の面数のものを作成できるようにしてください。負の面数や、1面ダイスには意味がありません。2面以上のダイスが作成できるようにしましょう。さいころの目の合計がオーバーフローしないように気を配ってみてください。
問題2 さいころを振って確率の値を確かめましょう
2つのことを確かめましょう。
(1)6面のさいころをなるべく多くの回数振って、それぞれの目ごとに(出現回数)/(試行回数)を計算しましょう。
(2)6面のさいころを2回振って、出た目の合計が3になる場合と5になる場合の数それぞれについて(出現回数)/(試行回数)を計算しましょう。なるべく多くの回数試行してください。
(1)を実行すると、さいころを振った数の6分の1に近い数になるはずです。(2)を実行すると3になる場合より5の出る場合の方が倍近く多いはずです。理論的に計算した確率の値と、コンピュータ・シミュレーションによる実験結果がどれほど一致するのか、それともしないのか、確かめてみましょう。
解説
問題1 さいころの働きをするクラスを作りましょう
完成したDiceクラスのみを示します。このクラスがあれば、さいころを使った確率の実験やゲームに役立つことでしょう。
大変シンプルなクラスですので、クラスを作るのが初めてだ、という人にもチャレンジしやすい問題だったことでしょう。このDiceクラスは、ファイルDice.javaとして保存し、今後の演習問題で活用できるよう保管しておいてください。
問題2 さいころを振って確率の値を確かめましょう。
問題1で作成したDiceクラスをひとつのファイルとして保存しましょう。ファイル名はクラス名+.javaにしなければなりませんから、Dice.javaとします。保存した後、次のようにコマンドラインでコンパイルします。
コンパイルを実行したディレクトリ内にDice.classが作成されます。その後、同じディレクトリで、確率の計算を実行するプログラムをコンパイルすると良いでしょう。以下にそのプログラム例 Sample_TestProbabilityByDiceRoll.javaを示します。
シミュレーションの結果得られた(目的の場合の数)/(試行回数)の値が、確率の数学で求めた値と近ければ、確率の数学は実際的な事柄に適用しても有意義であると言えます。確率の数学知識は、膨大な数の試行を行わなくとも、理論的に結果を推測できるのですから、役にたちます。
シミュレーションは試行回数が多ければ多いほど、確率の計算で求めた値と近くなるはずです。試行の数が多ければ多いほど理論計算値と試行の結果が近くなる、という状況を、確率の数学では大数の法則[1]といいます。逆にとらえれば、試行回数が少ない場合は確率の数学はあてにならないと言えます。
試行回数が十分に大きいのに、確率の数学を用いた値と、シミュレーション結果との間に大きな違いがあるならば、確率の数学の考え方、あるいは問題のとらえ方に問題があるかもしれません。逆に、シミュレーションの手順にどこか問題があるのかもしれません。基本に立ち戻って、原因の究明に努めてみてください。問題が起こったときこそが、最高の学習の機会です。