ゆるゆるプログラミング

・サイコロの出目確率

サイコロは、卓上ゲームなどに使われる道具で乱数を発生するときに使われます。一般的なものは正6面体で各面に1個から6個の点が記されています。さらに、対面の数字の和が7になるように記されています。具体的には1の裏は6、2の裏は5、3の裏は4です。

ここでは、乱数で1から6の数字を複数回発生し、それらの値をサイコロの出目(振って出た数字)としたときに、1から6の値が均等に現れるかどうかを確認します。

以下が、Javaソースコードです。

Dice.java ← クリックしてダウンロードページに移動
001:    public class Dice {
002:    	public static void main(String[] args) {
003:    		// サイコロを振る回数
004:    		int count = 100000;
005:    		// 出目数
006:    		int deme_num[] = new int[ 6 ];
007:    
008:    		// 各出目数に0を格納
009:    		for ( int i = 1; i <= 6; ++ i ) deme_num[ i - 1 ] = 0;  
010:    
011:    		// 100000回乱数を発生(サイコロを振る)
012:    		for ( int i = 1; i <= count; ++ i ) {
013:    			// 1から6の乱数を発生
014:    			int deme = (int)( Math.random() * 6.0 ) + 1;
015:    
016:    			// 出目(deme)の配列にに1を足す
017:    			++ deme_num[ deme - 1 ];  
018:    		}
019:    
020:    		// 結果を表示
021:    		for ( int i = 1; i <= 6; ++ i ) {
022:    			System.out.println( "出目" + i + ":"
023:    				+ deme_num[ i - 1 ] + "回"
024:    				+ "  確率:"
025:    				+ (double)deme_num[ i - 1 ] / (double)count * 100.0 + "%" );
026:    		}
027:    	}
028:    }

Dice.javaの出力結果

出目1:16731回  確率:16.730999999999998%
出目2:16552回  確率:16.552%
出目3:16689回  確率:16.689%
出目4:16504回  確率:16.503999999999998%
出目5:16645回  確率:16.645%
出目6:16879回  確率:16.878999999999998%

実行結果は、毎回違います。

各出目(1~6)の確率が1/6≒0.166666...(16.6666...%)に近ければ均等に出現しているといえます。この出現確率はサイコロを振る回数によって変わります。一般的には、サイコロを振る回数が多いほど確率が均等になります。この実行結果では、出現確率が16.50~16.88%に収まっているので、ほぼ均等であるといえます。乱数を利用するゲーム(トランプ、麻雀、じゃんけん等)で使用するには問題ないレベルだと思います。

乱数を発生するプログラムを自作する場合、このようなプログラムによって出現確率を確認することができます。うまく自作できていない場合、出目の回数に偏りが出ます。

ここからソースコードを順番に解説していきます。

001:    public class Dice {

クラス名を、Diceとしています。

003:    		// サイコロを振る回数
004:    		int count = 100000;

サイコロを振る回数(count=100000)を宣言しています。

005:    		// 出目数
006:    		int deme_num[] = new int[ 6 ];

各出目の回数を格納する配列を宣言しています。

008:    		// 各出目数に0を格納
009:    		for ( int i = 1; i <= 6; ++ i ) deme_num[ i - 1 ] = 0;  

各出目の回数に0を代入しています。

このプログラムでは、deme_num[ 0 ]は出目1の回数、deme_num[ 1 ]は出目2の回数、deme_num[ 2 ]は出目3の回数、deme_num[ 3 ]は出目4の回数、deme_num[ 4 ]は出目5の回数、deme_num[ 5 ]は出目6の回数を格納しています。

011:    		// 100000回乱数を発生(サイコロを振る)
012:    		for ( int i = 1; i <= count; ++ i ) {

for文でcount回のループしています。

013:    			// 1から6の乱数を発生
014:    			int deme = (int)( Math.random() * 6.0 ) + 1;

1~6の乱数をMath.randomメソッドを使って発生し、int型変数demeに格納しています。

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未満の乱数

016:    			// 出目(deme)の配列にに1を足す
017:    			++ deme_num[ deme - 1 ];  

配列deme_numの添え字deme-1の値をインクリメント(1を足す)します。変数demeには1~6の値が格納されていますが、配列添え字は0からなのでdeme_num[ deme - 1 ]をインクリメントします。

020:    		// 結果を表示
021:    		for ( int i = 1; i <= 6; ++ i ) {
022:    			System.out.println( "出目" + i + ":"
023:    				+ deme_num[ i - 1 ] + "回"
024:    				+ "  確率:"
025:    				+ (double)deme_num[ i - 1 ] / (double)count * 100.0 + "%" );
026:    		}

結果を出力しています。

■関連コンテンツ

乱数 random Math.randomの使い方について解説
for文 繰り返し処理に使用するfor文について解説
配列 同じ型の変数をまとめた配列について解説
インクリメント・デクリメント演算子 インクリメント、デクリメント演算子について解説

■新着情報

2020.06.03 円を描く(テキスト版) テキストを円を描く
2020.06.02 文字の間違い探し どの文字が違う?
2020.05.31 九九(くく)の表を作る2 掛け算なしで九九(くく)の表を作成
2020.05.07 サイコロの出目確率 サイコロの目のでる確率は?

■広告

フィギュア予約最大25%OFF+ポイント5%還元!ホビーサーチ

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

Topへ