2024.10.30

2つのサイコロの出目の和の確率

はじめに

ここでは、2つのサイコロを振った時の出目の和が出る確率の論理値を確認するJavaソースコードを紹介します。

また、乱数を使って和が出る確率を確認するJavaソースコードも紹介します。

出目の和の確率(理論値)の計算方法

2つのサイコロの出目の全て組み合わせの和を計算し、和ごとの個数を数えます。

以下の表は、2つのサイコロの出目の和を表したものです。全ての組み合わせ36通りの和を表示しています。

2つのサイコロの出目の和ごとの個数

この表から、和ごとの出現個数をまとめたものが以下の表です。

出目の和 出現個数
2 1個
3 2個
4 3個
5 4個
6 5個
7 6個
8 5個
9 4個
10 3個
11 2個
12 1個

和の出現個数を全組み合わせで割ると、出現確率の理論値が計算できます。

下の表の「出現率(%)」は出現確率の理論値を表したもので、「出現個数」を36で割った値です。

この「出現率(%)」が、2つのサイコロを振ったときの出目の和の確率(理論値)となります。

出目の和 出現個数 出現率(%)
2 1個 2.78
3 2個 5.56
4 3個 8.33
5 4個 11.11
6 5個 13.89
7 6個 16.67
8 5個 13.89
9 4個 11.11
10 3個 8.33
11 2個 5.56
12 1個 2.78

Javaソースコード - 理論値の確認

2つのサイコロの出目の和の確率(理論値)を確認するJavaソースコードです。

Dice2_1.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
public class Dice2_1 {
	public static void main(String[] args) {
		// 出目の回数(2-12)
		int numbers[] = new int[ 11 ];

		// 出目1と出目2の全ての組み合わせ
		for ( int deme1 = 1; deme1 <= 6; ++ deme1 ) {
			for ( int deme2 = 1; deme2 <= 6; ++ deme2 ) {
				// 2つの出目の和の配列に1を足す
				++ numbers[ deme1 + deme2 - 2 ];
			}
		}

		// 結果を表示
		System.out.println( "2つサイコロの和の理論上の確率" );
		for ( int i = 2; i <= 12; ++ i ) {
			System.out.println( i + "になる確率 : " + numbers[ i - 2 ] + "/36  " +  (double)numbers[ i - 2 ] / 36.0 * 100.0 + "%" );
		}
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis Dice2_1.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac Dice2_1.java

実行

C:\talavax\javasample>java Dice2_1

実行結果

2つサイコロの和の理論上の確率
2になる確率 : 1/36  2.7777777777777777%
3になる確率 : 2/36  5.555555555555555%
4になる確率 : 3/36  8.333333333333332%
5になる確率 : 4/36  11.11111111111111%
6になる確率 : 5/36  13.88888888888889%
7になる確率 : 6/36  16.666666666666664%
8になる確率 : 5/36  13.88888888888889%
9になる確率 : 4/36  11.11111111111111%
10になる確率 : 3/36  8.333333333333332%
11になる確率 : 2/36  5.555555555555555%
12になる確率 : 1/36  2.7777777777777777%

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

001
public class Dice2_1 {

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

002
	public static void main(String[] args) {

このmainメソッドからプログラムを実行します。

003
004
		// 出目の回数(2-12)
		int numbers[] = new int[ 11 ];

サイコロ2つの和の個数を格納するint型配列numbersを作成しています。

和の最小は「2」、最大は「12」なので、「2」から「12」の11個の和の個数が格納できる配列を作成してます。

作成直後のnumbers配列の値は、全て0になっています。

006
007
008
		// 出目1と出目2の全ての組み合わせ
		for ( int deme1 = 1; deme1 <= 6; ++ deme1 ) {
			for ( int deme2 = 1; deme2 <= 6; ++ deme2 ) {

for文2重ループを作成しています。

1つ目のサイコロの出目を表す変数deme1を1から6、2つ目のサイコロの出目を表す変数deme2を1から6に変化させることで、全ての和の組み合わせが計算できるようにしています。

009
010
				// 2つの出目の和の配列に1を足す
				++ numbers[ deme1 + deme2 - 2 ];

変数deme1と変数deme2を足した値から2を引いた値を、配列numbersの添え字にして、インクリメント(1を足す)しています。

和が「2」の個数はnumbers[0]、「12」の個数はnumbers[10]に格納していくようにしているので、和のから2を引いた値を添え字にしています。

014
015
		// 結果を表示
		System.out.println( "2つサイコロの和の理論上の確率" );

結果をコンソール出力しています。

ここでは、文字列"2つサイコロの和の理論上の確率"をprintln文を使って出力しています。

016
017
018
		for ( int i = 2; i <= 12; ++ i ) {
			System.out.println( i + "になる確率 : " + numbers[ i - 2 ] + "/36  " +  (double)numbers[ i - 2 ] / 36.0 * 100.0 + "%" );
		}

「2」から「12」の和の出現確率をコンソール出力しています。

for文を使って変数iを2から12に変化させ、和の個数を格納した配列numbers[ i - 2 ]の値、numbers[ i - 2 ]から計算した確率(%)を出力しています。

Javaソースコード - 乱数を使った確認

2つのサイコロの出目の和の確率を乱数をつかって確認するJavaソースコードです。

Dice2_2.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
public class Dice2_2 {
	public static void main(String[] args) {
		// サイコロを振る回数
		int count = 100000;

		// 出目の回数(2-12)
		int numbers[] = new int[ 11 ];

		// 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;

			// 2つの出目の和の配列に1を足す
			++ numbers[ deme1 + deme2 - 2 ];
		}

		// 結果を表示
		System.out.println( "サイコロを振った回数:" + count + "回" );
		for ( int i = 2; i <= 12; ++ i ) {
			System.out.println( i + "になる確率 : " +  (double)numbers[ i - 2 ] /  (double)count * 100.0 + "%" );
		}
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis Dice2_2.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac Dice2_2.java

実行

C:\talavax\javasample>java Dice2_2

実行結果

サイコロを振った回数:100000回
2になる確率 : 2.686%
3になる確率 : 5.5329999999999995%
4になる確率 : 8.43%
5になる確率 : 11.076%
6になる確率 : 13.869000000000002%
7になる確率 : 16.853%
8になる確率 : 13.923%
9になる確率 : 11.021%
10になる確率 : 8.315999999999999%
11になる確率 : 5.539000000000001%
12になる確率 : 2.754%

理論値に近い確率が出力されています。

実行結果は毎回違いますが、理論値に近い確率が出力されます。

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

001
public class Dice2_2 {

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

002
	public static void main(String[] args) {

このmainメソッドからプログラムを実行します。

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

サイコロを振る回数をint型変数countに代入しています。

ここでは100000を代入しています。

006
007
		// 出目の回数(2-12)
		int numbers[] = new int[ 11 ];

サイコロ2つの和の個数を格納するint型配列numbersを作成しています。

和の最小は「2」、最大は「12」なので、「2」から「12」の11個の和の個数が格納できる配列を作成してます。

作成直後のnumbers配列の値は、全て0になっています。

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

for文でcount回サイコロ振るループを作成しています。

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つ目のサイコロの出目を格納する変数deme1に1から6乱数の値を格納しています。

2つ目のサイコロの出目を格納する変数deme2に1から6乱数の値を格納しています。

Math.randomメソッド

public static double Math.random()
・乱数を返します。

  パラメータ なし

  戻り値     0.0以上、1.0未満の乱数

Math.random()戻り値は、0.0以上で1.0未満です。

したがって、(int)( Math.random() * 6.0 )の値は、整数の0から5になります。

( Math.random() * 6.0 )の値はdouble型です。この式の頭に(int)を付けてint型型キャストするとdouble型の値の小数部が切り捨てられるので0から5になります。

(int)( Math.random() * 6.0 )に1を足すことで1から6の乱数を作成しています。

017
018
			// 2つの出目の和の配列に1を足す
			++ numbers[ deme1 + deme2 - 2 ];

変数deme1と変数deme2を足した値から2を引いた値を、配列numbersの添え字にして、インクリメント(1を足す)しています。

和が「2」の個数はnumbers[0]、「12」の個数はnumbers[10]に格納していくようにしているので、和のから2を引いた値を添え字にしています。

021
022
		// 結果を表示
		System.out.println( "サイコロを振った回数:" + count + "回" );

結果をコンソール出力しています。

println文を使ってサイコロを振った回数を出力しています。

023
024
		for ( int i = 2; i <= 12; ++ i ) {
			System.out.println( i + "になる確率 : " +  (double)numbers[ i - 2 ] /  (double)count * 100.0 + "%" );

「2」から「12」の和の出現確率をコンソール出力しています。

for文を使って変数iを2から12に変化させ、和の個数を格納した配列numbers[ i - 2 ]の値、numbers[ i - 2 ]から計算した確率(%)を出力しています。

以上です。

関連コンテンツ

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

Javaのmainメソッドで受け取るパラメータについて解説しています。

2017.09.26

mainメソッドで受け取るパラメータの数の取得の仕方について解説しています。

2019.05.14

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

1から6のサイコロの目が出る確率を割り出すプログラムの作りかたを解説しています。

2020.05.07

乱数の意味と、Math.randomメソッドの使い方をソースコードを使って詳しく解説しています。

2015.12.27

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

同じ型の変数(データ)を複数個まとめて管理するデータの持ちかたがあります。これが配列です。くわしくは、記事をご覧ください。

2016.01.14

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

for文などのループ中に、さらにループがある多重ループについて解説しています。

2021.02.09

整数型の変数に1を足すインクリメント、1つ引くデクリメントについて詳しく説明しています。

2020.03.23

for文で変数名iがよく使われる理由について説明しています。興味のある方は是非。

2022.08.29

繰り返し処理の作り方を解説しています。

2016.03.02

メソッドを抜けるときに使用するreturn文について説明しています。

2020.03.20

自然数と整数って何が違う?

2020.03.23

データの型を変換する方法を詳しく解説しています。例)int型 → long型

2015.11.01

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

広告