teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

説明の追加

2018/04/21 02:57

投稿

退会済みユーザー
answer CHANGED
@@ -100,4 +100,46 @@
100
100
  はじめの選択から変更する場合
101
101
  当たった回数: 66892/100000
102
102
 
103
+ また、10回の試行をして、それセットを100000回ずつ繰り返し、その合計を求めてみます。
104
+
105
+ ```Java
106
+ public static void main(String[] args) {
107
+ int trycount = 10;
108
+ int try_set = 100000;
109
+ int c1, c2;
110
+ int sum1 = 0;
111
+ int sum2 = 0;
112
+ System.out.println("各 10回 試行します");
113
+ System.out.println("このセットを" + try_set + "回繰り返します。");
114
+ int i = 0;
115
+ while(i < try_set){
116
+
117
+ c1 = count(trycount, false);
118
+ c2 = count(trycount, true);
119
+
120
+ /*System.out.println("*** はじめの選択から変更しない場合");
121
+ System.out.println("当たった回数: " + c1 + "/" + trycount);
122
+ System.out.println("*** はじめの選択から変更する場合");
123
+ System.out.println("当たった回数: " + c2 + "/" + trycount);*/
124
+
125
+ sum1 += c1;
126
+ sum2 += c2;
127
+ i++;
128
+ }
129
+
130
+ System.out.println("はじめの選択から変更しない場合");
131
+ System.out.println("当たった回数の合計: " + sum1 + "/" + trycount * try_set);
132
+ System.out.println("はじめの選択から変更する場合");
133
+ System.out.println("当たった回数の合計: " + sum2 + "/" + trycount * try_set);
134
+
135
+ }
136
+ ```
137
+ <結果>
138
+ 各 10回 試行します
139
+ このセットを100000回繰り返します。
140
+ はじめの選択から変更しない場合
141
+ 当たった回数の合計: 333379/1000000
142
+ はじめの選択から変更する場合
143
+ 当たった回数の合計: 667234/1000000
144
+
103
145
  つまり初めの選択から変更する場合に傾きます。

2

説明の訂正

2018/04/21 02:57

投稿

退会済みユーザー
answer CHANGED
@@ -5,71 +5,99 @@
5
5
  ここに書くと長くなるので[モンティ・ホール問題とその解説](https://mathtrain.jp/monty)をご覧ください。
6
6
  結果だけ言うと選択肢を変えないで当たる確率が1/3,選択肢を変えて当たる確率が2/3です。
7
7
 
8
- <プログラミングで試行した結果>
8
+ ### 説明の訂正
9
- まずは私が書いたソースコードの説明をしま
9
+ 色んな方に指摘を受け、勘違していところ訂正しました
10
+ 最初私が書いたのは10000回の中で「選択肢を変えず当たる回数」「選択肢を変えて当たる回数」
11
+ を表示したものでした。
10
12
 
13
+ おそらく、「選択肢を変える」「選択肢を変えない」を**それぞれ**100000回くらい繰り返し、
14
+ 当たった回数を比較すべきだったと思います。
11
- 1.箱a,b,cを数字の0,1,2に置き換えま.あたりがあ場所が毎変わるときは
15
+ それぞれ100000回ずつ試行することで得られる結果(当たった数)を比較すにしました。
12
- 乱数を使うのですが今回は
13
16
 
14
- > a.b.cの箱1つに車が一台入ってて、aに絶対車が入ってるのが条件
17
+ 間違たことを書いしまい すみませんでした。
15
18
 
16
- なのであたり番号を0としておきます。```int hit_number = 0;```
19
+ ```Java
17
- 当たりの箱がランダムの時はここを乱数にしましょう。
20
+ import java.util.Random;
18
21
 
19
- 2.最初選択する番号を乱数で決めておきます。```int first_choice = rand.nextInt(3);```
22
+ public class Sum {
20
23
 
21
- 3.モンティ・ホール問題のルールに「途中で選択したもの以外の2つのうち
22
- はずれのほうの箱を開ける」があるので。```int hint;```という変数を用意します。
24
+ final static String BINGO = "あたり";
23
25
 
24
- この変数は当たりの番号でも最初に選択した番号でもないため これらの条件を満たすまで
26
+ public static void main(String[] args) {
27
+ int trycount = 100000;
28
+ int sum1;
29
+ int sum2;
25
- do~while文で処理する必要があります。(do~while文以外でも構いませんが...)
30
+ System.out.println("各" + trycount + "回 試行します");
31
+
32
+ sum1 = count(trycount, false);
33
+ sum2 = count(trycount, true);
26
34
 
27
- 4.後で選択を変える場合の番号ですが
28
- (最初選択した番号) + (ヒントとして開けた箱番号) + (後で選択える場合の番号) = 3;
35
+ System.out.println("はじめの選択から更しない場合");
29
- に気づけばif文で書かずに済みます。
36
+ System.out.println("当たった回数の合計: " + sum1 + "/" + trycount);
30
- 例えば最初1番箱を選択して,司会者が2番の箱を開けたとき選択をる場合の箱の番号は0で
37
+ System.out.println("はじめの選択から更する場合");
31
- 1 + 2 + 0 = 3となります。
38
+ System.out.println("当たった回数の合計: " + sum2 + "/" + trycount);
39
+
40
+ }
32
41
 
33
- 5.if文で選択を変えずに当たった場合と選択を変えて当たった場合をそれぞれカウントします。
42
+ static int count(int tryCount, boolean rechoice) {
43
+ int c = 0;
44
+ for (int i = 0; i < tryCount; i++) {
45
+ boolean b = judge(rechoice);
46
+ if (b)
47
+ c++;
48
+ }
34
49
 
35
- 1~5をwhile文またはfor文で10000回でも100000回でも試行すれば完了です。
50
+ return c;
51
+ }
36
52
 
53
+ static boolean judge(boolean rechoice) {//戻り値がfalseなら選択せずにあたった回数が増え,trueなら選択肢を変えて当たった回数が増える
37
- 以下、私が書いたソースコードを載せておきます。
54
+ String[] box = box();
55
+ int FirstChoice = yourChoice(3);
56
+ //rechoiceがtrueのときは選択を変える
57
+ if (rechoice) {
38
58
 
39
-
40
- ```Java
41
- import java.util.Random;
42
-
43
- class Main {
44
-
45
- public static void main(String[] args) {
59
+ String []box2 = new String[2];
46
-
47
- int loop = 0;
60
+ int pos = 0;
48
- int no_change = 0;
49
- int change = 0;
50
-
51
- while(loop < 1000000){
52
- Random rand = new Random();
53
- int hit_num= 0; //当たりの番号
61
+ for (int i = 0; i < 3; i++) {
54
- int first_choice = rand.nextInt(3);//最初の選択
55
- int hint;
56
- do{
57
- hint = rand.nextInt(3);
58
- }while(hint == hit_num || hint == first_choice);
59
-
60
- if(hit_num == first_choice){
62
+ if (FirstChoice != i) {
63
+ box2[pos] = box[i];
61
- no_change++;
64
+ pos++;
65
+ }
62
66
  }
63
- else if(hit_num == 3 - (first_choice + hint)){
67
+ for(int i = 0; i < 2; i++){
68
+ if(!box2[i].equals(BINGO)){
64
- change++;
69
+ return box2[1 - i].equals(BINGO);
70
+ }
65
71
  }
72
+ }
73
+ //rechoiceがfalseは選択を変えない
66
- loop++;
74
+ else {
75
+ return box[FirstChoice].equals(BINGO);
76
+
77
+
67
78
  }
68
- System.out.println("選択を変えなかった方" + no_change);
69
- System.out.println("選択を変えた方" + change);
79
+ return true;
70
- }
80
+ }
81
+
82
+ static int yourChoice(int c) {
83
+ Random random = new Random();
84
+ return random.nextInt(c);
85
+ }
86
+
87
+ static String[] box() { //当たりの番号をランダムに指定するなら中身のコメントん部分を使う
88
+ String[] box = { "ヤギ", "ヤギ", "ヤギ" };
89
+ //Random random = new Random();
90
+ //int i = random.nextInt(3);
91
+ box[0] = BINGO;
92
+ return box;
93
+ }
71
94
  }
72
95
  ```
96
+ <結果>(結果には毎回少しの誤差があります。この結果はその中の一つにすぎません)
73
- <結果>
97
+ 各100000回 試行します
98
+ はじめの選択から変更しない場合
74
- 選択を変えなかった方333587 (確率は約1/3)
99
+ 当たった回数: 33545/100000
100
+ はじめの選択から変更する場合
75
- 選択を変え方666413 (確率は約2/3)
101
+ った回数: 66892/100000
102
+
103
+ つまり初めの選択から変更する場合に傾きます。

1

ソースの訂正

2018/04/21 02:45

投稿

退会済みユーザー
answer CHANGED
@@ -38,8 +38,10 @@
38
38
 
39
39
 
40
40
  ```Java
41
- class Sum {
41
+ import java.util.Random;
42
42
 
43
+ class Main {
44
+
43
45
  public static void main(String[] args) {
44
46
 
45
47
  int loop = 0;