読者です 読者をやめる 読者になる 読者になる

TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

サイコロの目が6分の1の確率って本当!?

Python

皆さん
こんにちは、こんばんは
TomoProgです。

なんか昨日一日で約50PVぐらいされたようで、今月も100PVを達成出来ました!!
多くの人に見ていただけるのは非常にありがたいことです。
これからもマイペースに記事を書いていけたらと思います。

今回はサイコロの確率をPythonで計算してみました。

それでは頑張っていきましょう。

6回振れば1回は出るって本当?

ふと思ったんです。
サイコロを振って指定した目が出る確率は6分の1です。
でも、実際に6回振っても出ないときもある・・・

じゃあだいたい何回振れば6分の1になるんだろう?

今回はこんな疑問をPythonで解いていこうと思います。

サイコロプログラムを書く

まずはサイコロをプログラムで書いてみます。

#-*- coding:utf-8 -*-
import sys
import random

def dice_roll():
    """
        Content:
            サイコロを振る
    """
    return random.randint(0, 5)

def main():
    """
        Content:
            エントリーポイント
    """
    #--------------------------------
    # サイコロを振る回数を取得
    #--------------------------------
    roll_num = int(sys.argv[1])

    #--------------------------------
    # サイコロを振る
    #--------------------------------
    dice_list = [0]*6
    for i in range(roll_num):
        dice_list[dice_roll()] += 1

    #--------------------------------
    # 結果表示
    #--------------------------------
    print(dice_list)

if __name__ == "__main__":
    main()

実行引数にサイコロを振る回数を指定します。
指定した回数分だけdice_roll関数を呼び出し、出た目の回数をカウントしていきます。

実際に100回サイコロを振ってみた結果は以下のようになりました。

実行:
$ python3 dice.py 100
実行結果:
[21, 11, 13, 11, 21, 23]

6分の1で出るのであれば

100 ÷ 6 = 16.66666....

それぞれの出た回数が16付近であればいいのですが、そうでもなさそうですね。

実行結果をグラフ化する

上記のプログラムでサイコロを振るプログラムは完成しました。
もっと沢山サイコロを降る前に、もう少し実行結果を分かりやすくするためにグラフで表示してみようと思います。

Pythonにはもちろんグラフを表示するための便利なモジュールも用意されています。
今回はmatplotlibというモジュールを使用します。

ただ、このmatplotlibは他のモジュールとの依存関係が強いのかインストールするのがかなり大変でした。
Ubuntu14.04で使用する場合は以下のコマンドを順に入力していけばインストール出来ました。

$ sudo apt-get install python3-pip
$ sudo apt-get install libfreetype6-dev
$ sudo apt-get install libxft-dev
$ sudo apt-get install libffi-dev
$ sudo pip3 install cairocffi
$ sudo pip3 install matplotlib

さて、matplotlibを使用する環境が整ったので、先ほどのサイコロプログラムを改良し、円グラフを表示してみます。

#-*- coding:utf-8 -*-
import sys
import random
import matplotlib.pyplot as plt

def dice_roll():
    """
        Content:
            サイコロを振る
    """
    return random.randint(0, 5)

def main():
    """
        Content:
            エントリーポイント
    """
    #--------------------------------
    # サイコロを振る回数を取得
    #--------------------------------
    roll_num = int(sys.argv[1])

    #--------------------------------
    # サイコロを振る
    #--------------------------------
    dice_list = [0]*6
    for i in range(roll_num):
        dice_list[dice_roll()] += 1

    ##--------------------------------
    ## グラフ表示
    ##--------------------------------
    fig = plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(111)
    labels = [str(x) for x in range(1, 7)]
    ax.pie(dice_list, labels=labels, autopct="%1.1f%%", startangle=90, shadow=True)
    plt.show()

if __name__ == "__main__":
    main()

matplotlibを使う場合はimport文にmatplotlibを書いておきます。
import文でasを使用するとimportしたモジュールに別名を付けられるので便利です。
ax.pieでdice_listの中身の内容で円グラフを書くように指定しています。

実際に実行して表示してみます。

実行:
python3 dice.py 100

f:id:TomoProg:20160307234457j:plain

リストの結果を表示するよりもグラフで表示できたほうが格段に見やすくなりました。

沢山振ってみる

グラフの表示も可能になったので、今度は沢山のパターンでサイコロを振ってみます。
30回ずつサイコロを振る回数を増やしていくとこんな感じです。
(スタートが左上でZ字の順です。)
f:id:TomoProg:20160308000227j:plain
f:id:TomoProg:20160308001739j:plain

1枚目の上段のグラフ(30回〜120回)はバラバラなイメージが有りますが、下段(150回〜240回)は結構綺麗な円になりました。
2枚目(270回〜480回)に入るとかなり6等分に近づき、あまり変化が見られなくなりました。

まとめ

  • 大体150回くらいから6分の1の確率に近づいてくる。
  • 大体300回くらいサイコロを振れば6分の1の確率にかなり近くなる。

今回はPythonでサイコロを振ってグラフを描いてみました。
やるたびにまた結果は違うと思うと確率って奥深いですね。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@TomoHelloxxx) | Twitter