Pythonで当選率10%のくじを10回引く ~確率の悪魔 vs Python ep1 ~

python
python

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さんで勉強中!

コメント

タイトルとURLをコピーしました