pianofisica

Mathematics & Physics, Maxima, a bit Python & Wolfram, and Arts

Pythonで学ぶ確率・統計(不公平なサイコロ)

数学の具体的な問題にPythonを使って、数学もPythonも同時に学んでしまいましょう。今回はPythonを使った確率・統計の問題として、出る目の確率が均等でない不公平なサイコロを考えてみたいと思います。



公平なサイコロ:等しい確率

サイコロは正六面体の各面に1から6の目が描かれています。サイコロを投げて上を向いた面に書かれた目が、サイコロ投げで出た目ということになります。したがって、これをPythonで実現するためには、ランダムに1から6の数字を出力できれば良いことになりますが、実際そのような実装が用意されています。

import random as rd
rd.randint(1, 6)  # randint(a,b) で a 以上 b 以下の整数をランダムに出力

それぞれの目が出る確率は1/6ですから、例えば試行を12,000回繰り返してみるとそれぞれの目は2,000回くらいずつ出るはずです。これをヒストグラムを作成して確認してみます。

num_trial = int(1.2e4)
result = []
for k in range(num_trial):
    result.append(rd.randint(1, 6))

import matplotlib.pyplot as plt
plt.hist(result, bins=6, range=(1, 7))
plt.show()

より

といったヒストグラムを得て、うまくいっていることがわかります。


ちなみに、本記事は、以下の過去記事の発展的な内容になっています。あわせて読んでいただければさいわいです。

pianofisica.hatenablog.com

pianofisica.hatenablog.com




不公平なサイコロ:不均等な確率

さて、偶数の目だけ、奇数の目の2倍の確率で出るような、不公平なサイコロを考えてみます。このようなサイコロを実現するには、ランダムな出力に確率の重み付けをしないといけないのですが、このような実装もPythonにはすでに用意されています。

# サイコロの目
dice = [1,2,3,4,5,6]

# それぞれの目が出る確率的な重み
dice_weghit = [1,2,1,2,1,2]

rd.choices(dice, weights = dice_weghit)[0]

最後の [0] は、choices関数の出力がリスト形式なので、要素を取り出すために付けています。いま、偶数の目が出る確率は2/9、奇偶の目が出る確率は1/9のはずですから、例えば試行を18,000回繰り返してみると偶数の目は4,000回、奇数の目は2,000回くらいずつ出るはずです。これをヒストグラムを作成して確認してみます。

num_trial = int(1.8e4)
result = []
for k in range(num_trial):
    result.append(rd.choices(dice, weights = dice_weghit)[0])

import matplotlib.pyplot as plt
plt.hist(result, bins=6, range=(1, 7))
plt.show()

より

といったヒストグラムを得て、確かに不公平なサイコロが実現されていることがわかります。






今回は、乱数を使ってコンピュータ上で(不公平な)サイコロを実現してみました。本記事の応用編として、カードの山の残りの枚数に応じて出てくるカードの確率が変化していくような、より現実的な問題(カードめくり)について解説しているのが次の記事です。合わせて読んでみてください。

pianofisica.hatenablog.com





キーワードPython、確率・統計、乱数、サイコロ、ヒストグラム、データ作成、プロット