回答編集履歴

3

説明の追加

2018/04/21 02:57

投稿

退会済みユーザー
test CHANGED
@@ -202,4 +202,88 @@
202
202
 
203
203
 
204
204
 
205
+ また、10回の試行をして、それセットを100000回ずつ繰り返し、その合計を求めてみます。
206
+
207
+
208
+
209
+ ```Java
210
+
211
+ public static void main(String[] args) {
212
+
213
+ int trycount = 10;
214
+
215
+ int try_set = 100000;
216
+
217
+ int c1, c2;
218
+
219
+ int sum1 = 0;
220
+
221
+ int sum2 = 0;
222
+
223
+ System.out.println("各 10回 試行します");
224
+
225
+ System.out.println("このセットを" + try_set + "回繰り返します。");
226
+
227
+ int i = 0;
228
+
229
+ while(i < try_set){
230
+
231
+
232
+
233
+ c1 = count(trycount, false);
234
+
235
+ c2 = count(trycount, true);
236
+
237
+
238
+
239
+ /*System.out.println("*** はじめの選択から変更しない場合");
240
+
241
+ System.out.println("当たった回数: " + c1 + "/" + trycount);
242
+
243
+ System.out.println("*** はじめの選択から変更する場合");
244
+
245
+ System.out.println("当たった回数: " + c2 + "/" + trycount);*/
246
+
247
+
248
+
249
+ sum1 += c1;
250
+
251
+ sum2 += c2;
252
+
253
+ i++;
254
+
255
+ }
256
+
257
+
258
+
259
+ System.out.println("はじめの選択から変更しない場合");
260
+
261
+ System.out.println("当たった回数の合計: " + sum1 + "/" + trycount * try_set);
262
+
263
+ System.out.println("はじめの選択から変更する場合");
264
+
265
+ System.out.println("当たった回数の合計: " + sum2 + "/" + trycount * try_set);
266
+
267
+
268
+
269
+ }
270
+
271
+ ```
272
+
273
+ <結果>
274
+
275
+ 各 10回 試行します
276
+
277
+ このセットを100000回繰り返します。
278
+
279
+ はじめの選択から変更しない場合
280
+
281
+ 当たった回数の合計: 333379/1000000
282
+
283
+ はじめの選択から変更する場合
284
+
285
+ 当たった回数の合計: 667234/1000000
286
+
287
+
288
+
205
289
  つまり初めの選択から変更する場合に傾きます。

2

説明の訂正

2018/04/21 02:57

投稿

退会済みユーザー
test CHANGED
@@ -12,67 +12,25 @@
12
12
 
13
13
 
14
14
 
15
- <プログラミングで試行した結果>
16
-
17
- まずは私が書いたソースコードの説明をします。
18
-
19
-
20
-
21
- 1.箱a,b,cを数字の0,1,2に置き換えます.あたりがある場所が毎回変わるときは
22
-
23
- 乱数を使うですが今回は
15
+ ### 説明訂正
24
-
25
-
26
-
27
- > a.b.cの箱1つに車が一台入ってて、aに絶対車が入ってるのが条件
16
+
28
-
29
-
30
-
31
- なのであたり番号を0としておきます。```int hit_number = 0;```
32
-
33
- りの箱がランダムの時は乱数にしましょう
17
+ 色んな方に指摘を受け、勘違いしてい訂正しまし
34
-
35
-
36
-
37
- 2.最初選択する番号を乱数で決めておきます。```int first_choice = rand.nextInt(3);```
18
+
38
-
39
-
40
-
41
- 3.モンティ・ホール問題のルールに「途中で選択したもの以外の2つのうち
42
-
43
- はずれのほうの箱を開ける」があるので。```int hint;```という変数を用意します。
44
-
45
-
46
-
47
- この変数は当たりの番号でも最初に選択した番号でもないため これらの条件を満たすまで
48
-
49
- do~while文で処理する必要があります。(do~while文以外でも構いませんが...)
50
-
51
-
52
-
53
- 4.後で選択を変える場合の番号ですが
54
-
55
- (最初選択し番号) + (ヒントとして開けた箱番号) + (後で選択を変える場合の番号) = 3;
19
+ 最初私が書いたのは10000回の中選択を変えず当た回数」「選択肢を変えて当たる回数」
56
-
20
+
57
- に気づけばif文書かずに済みます
21
+ を表示したものした
58
-
22
+
23
+
24
+
59
- 例えば最初1番の箱を選択して,司会者が2番の箱開けたとき選択を変える場合の箱の番号は0
25
+ おそらく、「選択変える」「選択を変えない」を**それぞれ**100000回くらい繰り返し、
60
-
26
+
61
- 1 + 2 + 0 = 3なります。
27
+ 当たった回数を比較すべきだった思います。
62
-
63
-
64
-
28
+
65
- 5.if文で選択を変えに当たった場合選択を変えて当たった場合それぞれカウントしま
29
+ それぞれ100000回つ試行するこで得られる結果(当たった回数)比較することにしました
66
-
67
-
68
-
69
- 1~5をwhile文またはfor文で10000回でも100000回でも試行すれば完了です。
30
+
70
-
71
-
72
-
31
+
32
+
73
- 以下、私が書いたソースコードを載せおきます。
33
+ 間違ったことを書いてみませんでした
74
-
75
-
76
34
 
77
35
 
78
36
 
@@ -82,68 +40,166 @@
82
40
 
83
41
 
84
42
 
85
- class Main {
43
+ public class Sum {
44
+
45
+
46
+
47
+ final static String BINGO = "あたり";
86
48
 
87
49
 
88
50
 
89
51
  public static void main(String[] args) {
90
52
 
91
-
53
+ int trycount = 100000;
54
+
92
-
55
+ int sum1;
56
+
57
+ int sum2;
58
+
59
+ System.out.println("各" + trycount + "回 試行します");
60
+
61
+
62
+
63
+ sum1 = count(trycount, false);
64
+
65
+ sum2 = count(trycount, true);
66
+
67
+
68
+
69
+ System.out.println("はじめの選択から変更しない場合");
70
+
71
+ System.out.println("当たった回数の合計: " + sum1 + "/" + trycount);
72
+
73
+ System.out.println("はじめの選択から変更する場合");
74
+
75
+ System.out.println("当たった回数の合計: " + sum2 + "/" + trycount);
76
+
77
+
78
+
79
+ }
80
+
81
+
82
+
83
+ static int count(int tryCount, boolean rechoice) {
84
+
85
+ int c = 0;
86
+
87
+ for (int i = 0; i < tryCount; i++) {
88
+
89
+ boolean b = judge(rechoice);
90
+
91
+ if (b)
92
+
93
+ c++;
94
+
95
+ }
96
+
97
+
98
+
99
+ return c;
100
+
101
+ }
102
+
103
+
104
+
105
+ static boolean judge(boolean rechoice) {//戻り値がfalseなら選択せずにあたった回数が増え,trueなら選択肢を変えて当たった回数が増える
106
+
107
+ String[] box = box();
108
+
109
+ int FirstChoice = yourChoice(3);
110
+
111
+ //rechoiceがtrueのときは選択を変える
112
+
113
+ if (rechoice) {
114
+
115
+
116
+
117
+ String []box2 = new String[2];
118
+
93
- int loop = 0;
119
+ int pos = 0;
120
+
94
-
121
+ for (int i = 0; i < 3; i++) {
122
+
95
- int no_change = 0;
123
+ if (FirstChoice != i) {
96
-
124
+
97
- int change = 0;
125
+ box2[pos] = box[i];
98
-
99
-
100
-
126
+
101
- while(loop < 1000000){
127
+ pos++;
102
-
128
+
103
- Random rand = new Random();
129
+ }
130
+
104
-
131
+ }
132
+
105
- int hit_num= 0; //当たりの番号
133
+ for(int i = 0; i < 2; i++){
106
-
107
- int first_choice = rand.nextInt(3);//最初の選択
134
+
108
-
109
- int hint;
110
-
111
- do{
112
-
113
- hint = rand.nextInt(3);
135
+ if(!box2[i].equals(BINGO)){
136
+
114
-
137
+ return box2[1 - i].equals(BINGO);
138
+
139
+ }
140
+
141
+ }
142
+
143
+ }
144
+
145
+ //rechoiceがfalseは選択を変えない
146
+
147
+ else {
148
+
115
- }while(hint == hit_num || hint == first_choice);
149
+ return box[FirstChoice].equals(BINGO);
116
150
 
117
151
 
118
152
 
119
- if(hit_num == first_choice){
153
+
120
-
121
- no_change++;
122
-
123
- }
124
-
125
- else if(hit_num == 3 - (first_choice + hint)){
126
-
127
- change++;
128
-
129
- }
130
-
131
- loop++;
132
154
 
133
155
  }
134
156
 
135
- System.out.println("選択を変えなかった方" + no_change);
136
-
137
- System.out.println("選択を変えた方" + change);
157
+ return true;
138
-
158
+
139
- }
159
+ }
160
+
161
+
162
+
163
+ static int yourChoice(int c) {
164
+
165
+ Random random = new Random();
166
+
167
+ return random.nextInt(c);
168
+
169
+ }
170
+
171
+
172
+
173
+ static String[] box() { //当たりの番号をランダムに指定するなら中身のコメントん部分を使う
174
+
175
+ String[] box = { "ヤギ", "ヤギ", "ヤギ" };
176
+
177
+ //Random random = new Random();
178
+
179
+ //int i = random.nextInt(3);
180
+
181
+ box[0] = BINGO;
182
+
183
+ return box;
184
+
185
+ }
140
186
 
141
187
  }
142
188
 
143
189
  ```
144
190
 
191
+ <結果>(結果には毎回少しの誤差があります。この結果はその中の一つにすぎません)
192
+
145
- <結果>
193
+ 各100000回 試行します
194
+
146
-
195
+ はじめの選択から変更しない場合
196
+
147
- 選択を変えなかった333587 (確率は約1/3)
197
+ 当たった回数: 33545/100000
198
+
148
-
199
+ はじめの選択から変更する場合
200
+
149
- 選択を変え666413 (確率は約2/3)
201
+ った回数: 66892/100000
202
+
203
+
204
+
205
+ つまり初めの選択から変更する場合に傾きます。

1

ソースの訂正

2018/04/21 02:45

投稿

退会済みユーザー
test CHANGED
@@ -78,7 +78,11 @@
78
78
 
79
79
  ```Java
80
80
 
81
+ import java.util.Random;
82
+
83
+
84
+
81
- class Sum {
85
+ class Main {
82
86
 
83
87
 
84
88