

Pythonには理論演算子が用意されている。この理論演算子の使用方法はさまざまあるが、今回は、確率のおける理論演算子をPythonのコードとともにみていきましょう。
簡単な例を使って解説していきます。1つはコインの裏表の確率、もう1つはサイコロの目です。よくある例題ですね。
前提条件として、コインの裏表の確率は1/2、サイコロの目の確率は1/6で、コインとサイコロの結果は互いに干渉しない(独立している)こととします。
Pythonの環境設定はAnacondaをインストールし、Jupyter Labを使っています。過去記事を参照して下さい。
【2021年最新】M1 mac でanacondaをインストールする方法
【2021年最新】WindowsでAnacondaをインストールする方法
必要なライブラリをインポート
import numpy as np import random
コイン投げ
coin = [0, 1] for i in range(5): print(random.choice(coin)) # ランダムに「coin」から1つ選ぶ
出力:
0
0
0
1
1
この出力は、コインのシミュレーション(0か1)を5回実行した結果です。ランダムなので、コードを実行するたびに結果は変わります。
前提条件でも示しましたが、コインの結果が0になる確率を考えてみましょう。
1/2
出力:
0.5
当然、コインの結果は、0と1の確率は半々、50%です。
では、シミュレーションしてみましょう。
コイン投げのシミュレーション
num_sample = 10000 result = 0 for i in range(num_sample): # 「num_sample」回数実行する if random.choice(coin)==1: # 「coin」が1であれば result+=1 # 「result」に1を加算する print(result/num_sample) # 「coin」が1であった確率
出力:
0.4959
ほぼ、0.5ですね。これもランダムなので、0.5にならないですが、近い結果になることが確認できました。
このシミュレーションは、コインの結果が1であった場合は、「result」に1を加算しています。つまり、「result」は10000回コイン投げをしたときに、1が出た回数を表します。なので、コインの結果が1である確率は、「result」にシミュレーション回数である「num_sample」を割ります。
サイコロ投げ
dice = [1, 2, 3, 4, 5, 6] for i in range(5): print(random.choice(dice)) # ランダムに「dice」から1つ選ぶ
出力:
5
1
2
6
2
サイコロは1~6なので、diceを[1, 2, 3, 4, 5, 6]としています。
では、サイコロの結果が1になる確率を計算してみましょう。
1/6
出力:
0.16666666666666666
サイコロ投げのシミュレーション
num_sample = 10000 result = 0 for i in range(num_sample): if random.choice(dice)==1: result+=1 print(result/num_sample)
出力:
0.1738
少し、計算結果とずれていますが、ほぼ近い数値になっています。ちなみに確率は、シミュレーションの回数を増やせば増やすほど理論値に近くなります。
コイン0かつサイコロ1
1/12
出力:
0.08333333333333333
これは、コインが0である確率 1/2 と、サイコロが1である確率 1/6 を掛けることを同じです。
(1/2)*(1/6)
出力:
0.08333333333333333
シミュレーション(コイン0かつサイコロ1)
num_sample = 10000 result = 0 for j in range(num_sample): if (random.choice(coin)==0)and(random.choice(dice)==1): # 条件 and 条件 result+=1 print(result/num_sample)
出力:
0.0822
ほぼ同じような数値ですね。シミュレーション通りでした。
コイン0かつサイコロ1の否定
では、さきほどの結果の否定をしていきましょう。すべての確率は1なので、1からさきほどの数値を引けば、否定の確率が分かります。
1-(1/2)*(1/6)
出力:
0.9166666666666666
シミュレーション(コイン0かつサイコロ1の否定)
num_sample = 10000 result = 0 for j in range(num_sample): if not((random.choice(coin)==0)and(random.choice(dice)==1)): # not 条件 result+=1 print(result/num_sample)
出力:
0.9141
計算した理論値を近い数値になりました。
コイン0またはサイコロ1
コイン0かサイコロ1のどちらかが成立していたら条件達成という意味です。
これは、コインが0の確率とサイコロが1の確率を足して、さらに重複した確率(コイン0かつサイコロ1)を引けばいいです。
(1/2)+(1/6)-((1/2)*(1/6))
出力:
0.5833333333333333
シミュレーション(コイン0またはサイコロ1)
上で示した計算は、若干面倒ですが、Pythonのコードでは簡単です。「or」を使います。
num_sample = 10000 result = 0 for j in range(num_sample): if (random.choice(coin)==0)or(random.choice(dice)==1): # 条件 or 条件 result+=1 print(result/num_sample)
出力:
0.5735
理論値と同じくらいですね。
コイン0かサイコロ1かどちらか片方だけ
コイン0とサイコロ1で、両方成り立つ場合は含みません。どちらか片方だけが成り立つ場合のみです。
(1/2)+(1/6)-((1/2)*(1/6))*2
出力:
0.5
コイン0の確率と、サイコロ1の確率を足して、重複する確率を2回引いています。
シミュレーション(コイン0、サイコロ1どちらか片方)
num_sample = 10000 result = 0 for j in range(num_sample): if (random.choice(coin)==0)^(random.choice(dice)==1): # 条件 ^ 条件 result+=1 print(result/num_sample)
出力:
0.4999


コメント