---
title: モンティーホール問題証明
tags:  #python #kumec #template #モンティ・ホール  
author: [KUMEC矮鶏](https://convert.docswell.com/user/7162760403)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/5EG3NK567L.jpg?width=480
description: プログラミング初心者向けにpython勉強用です。 KUMECのスライドtemplateとして使われています。 ブログ：https://kumec-medical-engineers-club.blogspot.com/2024/09/kumec-powerpoint.html
published: October 04, 24
canonical: https://convert.docswell.com/s/7162760403/ZYD1G9-KUMEC-template
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/5EG3NK567L.jpg)

モンティー・ホール問題から
プログラミングを学ぼう！
基礎編


# Page. 2

![Page Image](https://bcdn.docswell.com/page/4JQ5QNZ27P.jpg)

モンティー・ホール問題とは？
説明
構文
タスク
直感で正しいと思える解答と、論理的に正しい解答が異なる問題
アメリカでモンティー・ホールが司会を務めるゲームショー番組「Let’s make a deal」
で行われたゲームのひとつ。
３つのドアの向こうに、当たりのスポーツカーとハズレのヤギが入っている。
回答者は、まず３つのドアの中から、当たりと思う一つのドアを選ぶ。
司会者モンティーは、選ばなかった２つのドアからハズレのドア一つを開ける。
回答者は、残ったドアからもう一度ドアを選ぶチャンスがもらえる。
このとき、回答者はドアを選び直した方がよいか否か。


# Page. 3

![Page Image](https://bcdn.docswell.com/page/K749NG3PE1.jpg)

モンティー・ホール問題とは？
説明
構文
タスク


# Page. 4

![Page Image](https://bcdn.docswell.com/page/LJ1K5D1X7G.jpg)

モンティー・ホール問題とは？
説明
構文
タスク


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GJWD5Y8K72.jpg)

モンティー・ホール問題の証明
説明
構文
タスク
当時、最も高いIQとして知られていたマリリン・ヴォス・サヴァントは、
「変えるべき」と言ったが、他の数学者たちはそんなわけないと反論した
• マリリンが連載していたコラム「マリリンにおまかせ」で、この問題が投稿され、
「変えると当たる確率が２倍」と答えたことによって、論争が勃発
• この回答が誤っているという投書が１万通も殺到し、その中には博士もたくさん
ふくまれていた。


# Page. 6

![Page Image](https://bcdn.docswell.com/page/4EZGNX8NJ3.jpg)

モンティー・ホール問題の証明
説明
構文
タスク
PCを使って数百回シミュレーションを行い、マリリンの主張が正しいと証明された
•
ロバート・サッチス博士「プロの数学者として、一般大衆の数学的知識の低さを憂慮する。自らの
間違いを認める事で現状が改善されます」
•
スコット・スミス博士「君は明らかなヘマをした（中略）世界最高の知能指数保有者である貴女が
自ら数学的無知をこれ以上世間に広める愚行を直ちに止め、恥を知るように！」
•
E・レイ・ボボ博士「（前略）現在、憤懣やるかたない数学者を何人集めれば、貴女の考えを改める
事が可能でしょうか？」
•
プロ数学者ポール・エルデシュの弟子だったアンドリュー・ヴァージョニが本問題を自前のパーソ
ナルコンピュータでモンテカルロ法を用いて数百回のシミュレーションを行うと、結果はサヴァン
トの答えと一致。
•
その後、カール・セーガンら著名人らがモンティーホール問題を解説、サヴァントの答えに反論を
行なっていた人々は、誤りを認める。


# Page. 7

![Page Image](https://bcdn.docswell.com/page/Y76Y84P9EV.jpg)

どうやって実装する？
説明
構文
タスク
このモンティーホール問題を実際にシミュレーションで証明しよう！
今回は、モンティーホール問題に即したプログラムを実際に作成し、それぞれ100回ぐらい
シミュレーションを行って、勝率にどれぐらい差が出るか確認してみる。
※実際は、数学的に正しくするため、モンテカルロ法を用いるが、今回はプログラムを簡
単にするため、数学的正しさは考えないこととする
モンティーホール問題
• ３つのドアに当たりが一つ入っている。
• 回答者は、まず３つのドアの中から、１つドアを選ぶ。
• 司会者モンティーは、選ばなかった２つのドアからハズレのドア一つを開ける。
•
•
もし回答者が当たりを選んでいたら、２つのハズレのうちランダムにドアを一つ開ける
もし回答者がハズレを選んでいたら、ハズレのドアを開ける
• 回答者は、モンティーが残したドアを選び直す or ランダムに残されたドアを選ぶ


# Page. 8

![Page Image](https://bcdn.docswell.com/page/G75G9QKD74.jpg)

どうやって実装する？
説明
構文
タスク
この問題をどうやってコードで書けばいい？
まずは、コードで書けるように、どんなフローチャート・タスクにわけられる？
(使用するプログラミング言語はPythonを想定しています。)
モンティーホール問題
• ３つのドアに当たりが一つ入っている。
• 回答者は、まず３つのドアの中から、１つドアを選ぶ。
• 司会者モンティーは、選ばなかった２つのドアからハズレのドア一つを開ける。
•
•
もし回答者が当たりを選んでいたら、２つのハズレのうちランダムにドアを一つ開ける
もし回答者がハズレを選んでいたら、ハズレのドアを開ける
• 回答者は、モンティーが残したドアを選び直す or ランダムに残されたドアを選ぶ


# Page. 9

![Page Image](https://bcdn.docswell.com/page/9J2Y2P6MJR.jpg)

説明
私が考えたフロー
構文
タスク
タスクをこう分けてみた！(一例)
モンティーホール問題
• ３つのドアからランダムに当たり１つを入れる
• ドアを一つ選ぶ
• モンティーが、選ばれなかったドアのうち、全てのヤギのドアを開ける(１つは残す)
•
もし回答者が当たりを選んでいたら、1つハズレのドアを残す
•
もし回答者がハズレを選んでいたら、当たりのドアを残す
• モンティーが残したドアを必ず選び直す or ランダムに残されたドアを選ぶ
• 選択したドアが当たりかどうか確認し、当たり引いたことを記録
• これを100回繰り返す


# Page. 10

![Page Image](https://bcdn.docswell.com/page/DEYGY59PEM.jpg)

私が考えたフロー
説明
構文
タスクをこう分けてみた！(一例)
タスク


# Page. 11

![Page Image](https://bcdn.docswell.com/page/VJNGPNLM78.jpg)

説明
Python
構文
タスク
初心者が学びやすいプログラミング言語
1991年にグイド・ヴァン・ロッサムにより開発されたプログラミング言語
KUMECのロゴのヘビも実はpythonを意識している
特徴
• Google Colaboratoryで簡単に試せる
• AIや機械学習の分野に強い言語


# Page. 12

![Page Image](https://bcdn.docswell.com/page/YE9W3R4WE3.jpg)

Google Colaboratoryの使い方
説明
構文
タスク
メモや文書を書ける
ここにコードを書く
使いやすい・おすすめ
学習教材
京大：プログラミング演習 Python 2023 ・ 東大Pythonプログラミング入門


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GE8NMWQR7D.jpg)

変数・関数とは？
説明
構文
タスク
関数(メソッド)は、数学のf(x)と似ている！
例えば：𝑓 𝑥 = 𝑥 2 + 2𝑥 + 1
• プログラミングでは、このxに当たる部分をこの関数の「引数」という
• 数学でもf(x)をg(x)やh(x)にしたように、プログラミングでもわかりや
すい名前をつけていい(ex. func() etc..)
• ほかにも、print(x)など、すでに準備されているメソッドがたくさん
Google Colaboratoryでprint(“Hello world”)と入れて実行してみよう


# Page. 14

![Page Image](https://bcdn.docswell.com/page/LELP3NX27R.jpg)

説明
変数・関数とは？
構文
タスク
変数とは、(基本的に)何でも入る箱
例えば：𝑥 2 + 2𝑥 + 1
• このｘみたいなかんじ
x=1
y = x + 10
print(y)
x=1
y = f (x) #f(x)はx+10を返す関数
print( y )
print( f(x) )


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4JM4DXL97W.jpg)

説明
変数・関数とは？
構文
変数とは、(基本的に)何でも入る箱
例えば：𝑥 2 + 2𝑥 + 1
• このｘみたいなかんじ
x = “World”
y = “Hello” + x + “!”
print(y)
タスク


# Page. 16

![Page Image](https://bcdn.docswell.com/page/PJRW4NK979.jpg)

計算してみよう！
説明
構文
タスク
四則演算は、数学の記号と異なるものもある


# Page. 17

![Page Image](https://bcdn.docswell.com/page/PEXP2NL37X.jpg)

乱数を生成してみよう！
説明
構文
タスク
pythonでは、簡単に乱数を発生させられる
import random #乱数を使うときの(とりあえず)呪文
x = random.randint(10, 20)
print(x)
randint(最低値、最高値)でこの範囲の整数の乱数を生成してくれる
他にもいろんなメソッドがあるから、調べてみてね
タスク1 / 9


# Page. 18

![Page Image](https://bcdn.docswell.com/page/3EKDMNLNJD.jpg)

タスク：その１-1
説明
構文
タスク
乱数を使って、0,1,2の中から1つランダムに
出力するコードを書いてみよう
タスク1 / 9


# Page. 19

![Page Image](https://bcdn.docswell.com/page/L73RYV3ZJ5.jpg)

タスク：その１-2
説明
構文
タスク
乱数を使って、0,1の中から1つランダムに出
力するコードを書いてみよう
タスク1 / 9


# Page. 20

![Page Image](https://bcdn.docswell.com/page/87DY58447G.jpg)

タスク1:関数・メソッドにしよう
説明
タスク1の関数を作ってみよう
def 関数名(引数1, 引数2…):
関数化したい処理
return 返り値
引数がない場合は()の中身は何も書かなくて良い
関数名は、わかりやすい名前にすると、後々使いやすい
タスク1 / 9
構文
タスク


# Page. 21

![Page Image](https://bcdn.docswell.com/page/VJP6G8MVE8.jpg)

bool型とは？
説明
構文
タスク
プログラミング言語にはbool型：True or Falseがある
型というものがコードにはある(今回は重要でないため割愛)
bool型は文字ではなくTrueとFalseという特別な値があるということ
今回の当たり・はずれ、あるorない、のような２つしかないものを表
すのに使われる。
毎回、変数に”sport car”とか”goat”を入れるのは大変
タスク2 / 9


# Page. 22

![Page Image](https://bcdn.docswell.com/page/2EV36N9R7Q.jpg)

説明
配列とは？
構文
タスク
変数をまとめて扱うもの
たとえば、体重のデータ5人分があるとき、
weight1 = 62, weight2 = 73, weight3=34, weight4=55, weight5=80
のように変数をたくさん作るの大変
配列を使うと…
weights = [62, 73, 34, 55, 80]
とすれば、扱いやすい！
weights[2]とすれば、変数と同じように扱える
タスク2 / 9
注意：
配列の番号は０始まり


# Page. 23

![Page Image](https://bcdn.docswell.com/page/57G3NKZ6JL.jpg)

説明
タスクその２
構文
タスク
３つのドアの中に１つの当たりをランダムに入れよう
0
1
2
doors = [True, False, False]のような配列を作れば良さそう
ランダムに入れるときに、タスク1の関数が使えそう
できたら、タスク2も関数化しよう！
タスク2 / 9


# Page. 24

![Page Image](https://bcdn.docswell.com/page/4EQ5QNL2JP.jpg)

タスクその3
説明
構文
タスク
３つのドアの中から一つ選ぶ処理を作ろう
タスク3 / 9


# Page. 25

![Page Image](https://bcdn.docswell.com/page/KJ49NGDP71.jpg)

配列から要素を除く
説明
構文
タスク
Ｎ番目の配列の要素を除くときは、delを使う
array = [1,2,3,4,5,6,7,8]
print(array) #[1,2,3,4,5,6,7,8]
del array[3]
#array[3] = 4
print(array) #[1,2,3,5,6,7,8]
タスク4 / 9


# Page. 26

![Page Image](https://bcdn.docswell.com/page/LE1K5DZXJG.jpg)

説明
If文とは？
構文
条件分岐をしたいときに使う構文
x=1
if x == 1:
print(x)
＃以下説明
if 条件式: #コロンを忘れずに！
なんか処理
#段落(インデント)を下げるのも忘れずに！
タスク4 / 9
条件式に使うのは
• ＝＝(等しいか？)
• ＞
• ＜
など
タスク


# Page. 27

![Page Image](https://bcdn.docswell.com/page/GEWD5Y9KJ2.jpg)

説明
If文とは？
構文
条件分岐をしたいときに使う構文
x=1
if x &lt; 1:
print(“1より小さい”)
elif x &lt; 2:
print(“２より小さい”)
elif x &lt; 3:
print(“3より小さい”)
else:
print(“3以上”)
タスク4 / 9
if 条件式:
なんか処理
elif 条件式:
なんか処理
else:
なんか処理
タスク


# Page. 28

![Page Image](https://bcdn.docswell.com/page/47ZGNX9NE3.jpg)

タスクその４
説明
構文
タスク
If文を駆使して、司会者モンティーがドアを残す(ハズレのドアを開ける)
処理を作ろう！
タスク4 / 9


# Page. 29

![Page Image](https://bcdn.docswell.com/page/YJ6Y84K97V.jpg)

タスクその５-1
説明
構文
タスク
マリリンの言う通りに、
選択を必ず変える処理を作ろう！
タスク5 / 9


# Page. 30

![Page Image](https://bcdn.docswell.com/page/GJ5G9QPDJ4.jpg)

タスクその5-2
説明
構文
タスク
マリリンの言うことを信じずに
ランダムに選び直す処理を作ろう！
タスク5 / 9


# Page. 31

![Page Image](https://bcdn.docswell.com/page/LE3RYV6Q75.jpg)

説明
for文とは
構文
タスク
繰り返し同じ処理をさせたいときに使う構文
for x in [0,1,2,3]:
print(x)
#0 1 2 3
for 変数 in 配列:
処理
for x in [0,1,2,3,4,5]:
print(x)
for 変数 in 配列:
処理
if x&gt; 2:
break
#0,1,2
タスク6 / 9
if 条件式:
break


# Page. 32

![Page Image](https://bcdn.docswell.com/page/8EDY58VWEG.jpg)

for文とは
説明
構文
タスク
100回同じ処理をさせたいときも、100個の要素がある配列が必要？
for x in range(5)
print(“Hello”)
#Hello Hello Hello Hello Hello
for x in range(5):
print(x)
#0,1,2,3,4
range(n)で生成される数字はn-1まで
タスク6 / 9
for 変数 in range(n):
処理 #n回繰り返される


# Page. 33

![Page Image](https://bcdn.docswell.com/page/V7P6G8VXJ8.jpg)

説明
for文とは
構文
タスク
x = x + 1とは、𝑥𝑛+1 = 𝑥𝑛 + 1
x=0
for i in range(5):
x=x+1
print(x)
#1,2,3,4,5
range(n)で生成される数字はn-1まで
タスク6 / 9
for 変数 in range(n):
x=x+1
# x+1したものが新たに代入される


# Page. 34

![Page Image](https://bcdn.docswell.com/page/2JV36NZ3EQ.jpg)

タスクその6
説明
構文
タスク
今までのメソッドを全て合わせて一通りの処理を作ってみよう！
全体の処理を100回繰り返して、当たった回数を出力しよう
タスク6 / 9


# Page. 35

![Page Image](https://bcdn.docswell.com/page/5EG3NK4Y7L.jpg)

タスクその7
説明
構文
タスク
ドアの数を増やせるように、今までのメソッドを作り変えよう
モンティーが回答者のために
残すドアは一つだけ
100個ドアがあれば、回答者が選ば
なかった99個のドアのうちヤギが
入っている98個のドアを開ける
タスク7 / 9


# Page. 36

![Page Image](https://bcdn.docswell.com/page/4JQ5QNG67P.jpg)

説明
クラスとは
構文
タスク
変数やメソッドをまとめて使いやすくしたもの
class Car:
def __init__(self, color, size):
self.color = color
self.size = size
self.tire_num = 4
def set_color(self,color):
self.color = color
print(color)
class クラス名:
def __init__(self,引数1):
self.変数1 = 引数1
self.変数2 = 0
def clean(self):
self.set_color(“white”)
print(“きれいになった”)
def 関数名(self, 引数):
処理
変数 = self.変数1
Prius = Car(“Blue”, 1.78)
Prius.clean()
#実際に使うとき
変数 = クラス名(引数1)
クラス名.関数名(引数)
タスク8 / 9
#呪文


# Page. 37

![Page Image](https://bcdn.docswell.com/page/K749NG5ME1.jpg)

タスクその8
説明
構文
タスク
マリリン信者クラスとマリリンアンチクラスを作ってみよう！
マリリン、アンドリュー、カールを
マリリン信者クラスのインスタンスとして作ってみよう
ロバート、スコット、レイを
マリリンアンチクラスのインスタンスとして作ってみよう
タスク8 / 9


# Page. 38

![Page Image](https://bcdn.docswell.com/page/LJ1K5DWY7G.jpg)

タスクその9
説明
構文
タスク
親クラスを作ろう！
マリリン信者クラスとマリリンアンチクラスでは、ほとんど
のメソッドが同じ
親クラスを作って、これらのメソッドをまとめよう！
そして、信者とアンチに親クラスを継承させよう
タスク9 / 9


# Page. 39

![Page Image](https://bcdn.docswell.com/page/GJWD5Y6172.jpg)

タスク番外編
説明
構文
タスク
Matplotlibを使って、それぞれのインスタンスの
勝率を棒グラフで作ってみよう
タスク番外 / 9


