Pythonを使って確率の悪魔と戦おう!
10%の確率で当たるくじを、10回引いた時にあたる確率はどれくらいだと思いますか?
引いたくじは毎回戻す(毎回確率は10%)前提です。
パッと考えると100%のような気がしますが、実際はどうでしょうか?
計算してみましょう。10回で当たる確率は、10回ともすべて外す場合の余事象になるので、以下で計算できます。
>>> 1-(9/10)**10
0.6513215599
約65%という事になりました。思っている以上に低い・・・
(ちなみに**が「べき乗」を表すのでしたね。^でやって早速引っ掛かりました。)
当たりを引く確率、という事で今回はこの曲で行きましょう。
布袋寅泰さんで、RUSSIAN ROULETTE← Youtube公式動画に飛びます。
さて、今回は本当にそうなるのかをPythonで検証していきたいと思います。
※ところどころ誤ったコードや説明が出てくる可能性があります。
(2021年2月28日:学習開始9日目)←言い訳と学習歴
1.作戦会議
まずは作戦を立てましょう!
①:10%であたるくじを作る
②:そのうち1つを引く
③:当たっているかどうか判定する。
④:上記を10回繰り返す。
⑤:引いた10回に当たりがあったかどうか判定する。
⑥:ここまでのをたくさん繰り返して、65%くらいに収束するかを調べる。→Ep2でやる。
こんな感じでしょうか?
調べてみると、プログラミングを書く人は「フローチャート」というものを書いて組み立てるようです。Wikipedia → フローチャート
IT Koala Naviさんの解説:若手プログラマー保存版!フローチャート徹底解説と作成カンニングペーパーに助けていただきました。
正しい書き方は分からないままですが、無理やり作ってみました。
今回は、10回繰り返すして、あたりがあったかどうかの判定までやってみます。
これでいいのだろうか・・・
正しいかどうかは分からないですが、作りたいものは表現できてそうです。先に進みましょう。
2.コードを書いていこう①
まずはくじを作るところからです。
箱の〇(あたり)が1つと×(はずれ)が9つあって、そこから1つ選ぶとイメージしました。
#くじをつくる
kuji = ['〇', '×1', '×2','×3','×4','×5','×6','×7','×8','×9',]
ちょっと無理やりですが、これでまずは良さそうです。
つぎは、くじを引くところです。くじを引くのは、自分の選択ではなくランダムでの選択が必要です。という事は最初にrandomを用意する必要がありそうです。
import random
道具が用意できたので、くじを引きます。
#くじをひく your_kujiが引いたくじ
your_kuji = random.choice(kuji)
では次はあたり判定です。〇ならあたり、×ならはずれです。
if your_kuji == '〇':
print('あたり')
else:
print('はずれ')
ちょっとここまでで実行してみましょう。
あと、何を引いたかわかるようにprint(you_kuji)もいれました。
まずはこれまでのコードをくっ付けました。
import random
#くじをつくる
kuji = ['〇', '×1', '×2','×3','×4','×5','×6','×7','×8','×9',]
#くじをひく your_kujiが引いたくじ
your_kuji = random.choice(kuji)
#〇ならあたり、×ならはずれ
print(your_kuji)
if your_kuji == '〇':
print('あたり')
else:
print('はずれ')
で、プログラムを実行。
×8
はずれ
できた!!あと、〇が出るかどうかも確認したいので、繰り返してみました。
・・・出ない。と思ってたら15回目で出た。これはやはり元の確率が正しい気がしてきました。
次は10回繰り返しです。全く同じものを10回書くことでもできますが、繰り返しはwhileで出来たはずです。
イメージは、
「引いた回数が1回ずつ増えるようにして、回数が10未満なら戻る。10になれば先に進む」
というような感じでしょうか?
#引いた回数
hiku_num = 0
while True:
if hiku_num == 10:
break
else:
#上のくじ引き
hiku_num += 1
確認してみましょう。ここまでのを全部をくっつけてみます。
import random
#引いた回数
hiku_num = 0
#くじをつくる
kuji = ['〇', '×1', '×2','×3','×4','×5','×6','×7','×8','×9',]
while True:
if hiku_num == 10:
break
else:
#くじをひく your_kujiが引いたくじ
your_kuji = random.choice(kuji)
#〇ならあたり、×ならはずれ
print(your_kuji)
hiku_num += 1
if your_kuji == '〇':
print('あたり')
else:
print('はずれ')
実行した結果です。
×2
はずれ
×5
はずれ
×1
はずれ
×7
はずれ
×1
はずれ
×2
はずれ
×6
はずれ
×3
はずれ
×7
はずれ
×4
はずれ
10回できましたね。まさかの全部はずれです・・・
これで、フロー図の左側までできました。次に行きましょう。
3.コードを書いていこう②
次は、「10回であたりがあったかどうか」の判定とあたりがあればあたり回数を増やすというところです。
あたりの回数をカウントして、あたり回数が0かそれ以外か?で判定できるように思います。
では、コードを書いてみましょう。
・初めにあたり回数を定義
・当たりが出たら回数を増やす
・当たりがあったかどうか?
という感じです。あと、「引いたくじ」と1回ずつのあたり判定のprintは消しておきます。
import random
#引いた回数
hiku_num = 0
#あたり回数
atari_count = 0
#くじをつくる
kuji = ['〇', '×1', '×2','×3','×4','×5','×6','×7','×8','×9',]
while True:
if hiku_num == 10:
break
else:
#くじをひく your_kujiが引いたくじ
your_kuji = random.choice(kuji)
#〇ならあたり、×ならはずれ
#print(your_kuji)
hiku_num += 1
if your_kuji == '〇':
#print('あたり')
atari_count += 1
else:
#print('はずれ')
pass
if atari_count == 0:
print('全滅!')
else:
print('あたりあった!')
これで、あたりがあれば「あたりがあった!」、なければ「全滅!」とでるはずです。
何度か繰り返して、両方出ることが確認できました。
あたりあった!
全滅!
やったーーー。最初に書いたフローチャートまではできました。
To Be Continued : 確率の悪魔 vs Python episode 2
PyQさんで勉強中!
コメント