2020.08.25
Javaプログラミング
ゾロ目の出る確率
理論上、ゾロ目になる確率は6/36=1/6≒16.6667%です。
1のゾロ目が出る確率は1/36なので、1から6のいずれかのゾロ目が出る確率は6/36=1/6となります。
Javaソースコード
Dice2.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028
public class Dice2 { public static void main(String[] args) { // サイコロを振る回数 int count = 100000; // ゾロ目の回数 int zorome_num = 0; // 100000回乱数を発生(サイコロを振る) for ( int i = 1; i <= count; ++ i ) { // 1つ目のサイコロ 1から6の乱数を発生 int deme1 = (int)( Math.random() * 6.0 ) + 1; // 2つ目のサイコロ 1から6の乱数を発生 int deme2 = (int)( Math.random() * 6.0 ) + 1; // 同じ数だったら出目(deme)の配列にに1を足す if ( deme1 == deme2 ) ++ zorome_num; } // 結果を表示 System.out.println( "サイコロを振った回数:" + count + "回" ); System.out.println( "ゾロ目の回数:" + zorome_num + "回" ); System.out.println( "ゾロ目の確率:" + (double)zorome_num / (double)count * 100.0 + "%" ); } }
実行結果
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Dice2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Dice2.java
実行
C:\talavax\javasample>java Dice2
出力結果
サイコロを振った回数:100000回 ゾロ目の回数:16376回 ゾロ目の確率:16.375999999999998%
実行結果は、毎回違います。
ゾロ目の確率が1/6≒0.166666...(16.6666...%)に近ければ理論どおりであるといえます。この出現確率はサイコロを振る回数によって変わります。一般的には、サイコロを振る回数が多いほど理論値に近づいていきます。
Javaソースコードの解説
ここからソースコードを順番に解説していきます。
001
public class Dice2 {
クラス名を、Dice2としています。
003 004
// サイコロを振る回数 int count = 100000;
サイコロを振る回数(count=100000)を宣言しています。
006 007
// ゾロ目の回数 int zorome_num = 0;
ゾロ目の回数を格納する変数を宣言して、初期値を0にしています。
009 010
// 100000回乱数を発生(サイコロを振る) for ( int i = 1; i <= count; ++ i ) {
011 012 013 014 015
// 1つ目のサイコロ 1から6の乱数を発生 int deme1 = (int)( Math.random() * 6.0 ) + 1; // 2つ目のサイコロ 1から6の乱数を発生 int deme2 = (int)( Math.random() * 6.0 ) + 1;
1~6の乱数をMath.randomメソッドを使って発生し、int型の変数deme1とdeme2に格納しています。
Math.random()は0.0から1.0未満の値を発生するので、"Math.random()*6.0"は0.0~6.0未満の値を発生します。これをint型で型キャストすると0~5の整数値になります("(int)(Math.random()*6.0)"の部分)。型キャストした値の小数点以下は切り捨てになるので6に近い値5.9999でも5になります。最後に1を足すと1~6の乱数になります。
Math.randomメソッド
public static double Math.random()
・乱数を返します。 パラメータ なし 戻り値 0.0以上、1.0未満の乱数
017 018 019
// 同じ数だったら出目(deme)の配列にに1を足す
if ( deme1 == deme2 )
++ zorome_num;
022 023 024 025 026
// 結果を表示 System.out.println( "サイコロを振った回数:" + count + "回" ); System.out.println( "ゾロ目の回数:" + zorome_num + "回" ); System.out.println( "ゾロ目の確率:" + (double)zorome_num / (double)count * 100.0 + "%" );
結果をprintlnメソッドでコンソール出力しています。ゾロ目の確率(%)は、ゾロ目の回数をサイコロを振った回数で割って100を掛けで計算しています。
以上です。