数理行動科学演習資料

サイコロをつくろう

最初にパッケージを読みこみます

In [12]:
import random #乱数発生用
import matplotlib.pyplot as plt #ヒストグラム用

次にDiceというサイコロ用クラスを定義します

In [13]:
class Dice:
    def shoot(self):
        return random.randint(1,6)

この Diceというクラスでは,1~6の整数乱数を発生させる shootというメソッドを定義しています.

このままでは,サイコロを振ることができないので, Diceクラスのオブジェクトをインスタンス化します.

インスタンス化 = オブジェクトの実例を作る,くらいの意味だと考えてください.

In [14]:
sai = Dice() #Diceクラスのインスタンス化

これでsaiという名前のオブジェクトが定義されました. 次にsaiのメソッドを呼び出してみましょう

Diceクラスにはshootしかメソッドがありません.

In [15]:
sai.shoot() #メソッドの呼び出し
Out[15]:
3

このように,メソッドを使うには,

オブジェクト名.メソッド名()

のように,「.」のあとに続けてメソッド名を書きます. メソッドが引数をとらない場合は()を最後につけます. 引数がある場合は

オブジェクト名.メソッド名(メソッドの引数)

という具合に使います.

さて,sai.shoot()は実行するたびにサイコロを振るので結果が 異なるので,同じサイコロを五回振ってみましょう

そのためにfor文でサイコロ振りの結果をリストxに記録します

In [16]:
x=[]
for i in range(10): # 10回繰り返し.rrangeで指定
    x.append(sai.shoot()) #list用メソッドappendを使う
x #結果の呼び出し
Out[16]:
[4, 5, 6, 1, 4, 5, 5, 6, 2, 3]

x面体サイコロ

つぎに,6面体だけでなく,10面体や20面体など好きな面数のサイコロを つくってみましょう

そのためにfaceという引数を使って,面数を選べるサイコロ用クラスを 新たに作ります

In [17]:
class Dice:
    def __init__(self, x):
        self.face = x
        print("This dice has",x,"faces" )
    def shoot(self):
        return random.randint(1, self.face)

さっきと同じDiceというクラスを定義しました. したがってDiceクラスは上書きされます.

あたらしいクラスでは,初期化メソッド(コンストラクタとも言う)

def init(self, 引数):

を使っています.初期化メソッドにより,faceという属性を定義しています. インスタンス化する際にface属性に引数の値を代入します.ここでは face属性がサイコロの面数を表しています.好きな面数を定義するために 引数化しています.

なおselfを明示的に指定するのはpythonの特徴です.最初はよく書き忘れるので 注意しましょう(わたしもよく忘れます).

ではインスタンス化してみましょう

In [18]:
sai10 = Dice(10) # 10面体サイコロ
This dice has 10 faces

インスタンス化すると「This dice has 10 faces(これは10面体のさいころです)」という メッセージが出てきました.初期化メソッドの2行目でprintするように指定したからです.

では振ってみましょう.10面体さいころなので1~10の数値がでます

In [19]:
sai10.shoot()
Out[19]:
6

つぎに20回連続してふってみましょう

In [20]:
x=[]
for i in range(20):
    x.append(sai10.shoot())
x
Out[20]:
[5, 10, 4, 3, 4, 1, 10, 6, 4, 10, 4, 3, 1, 2, 4, 6, 2, 9, 4, 10]

なお,このappendの使いかたは計算結果を保存するためによく使うので 覚えておいてください

最後にサイコロ振りの結果をヒストグラムで可視化してみましょう.

まず plotをインライン表示するオプションを有効にします

In [21]:
%matplotlib inline

for文でサイコロを1万回振り,各目が何回出たのか調べます

これはhistメソッドが勝手にやってくれます

In [22]:
x=[]
for i in range(10000):
    x.append(sai10.shoot())
    
plt.hist(x,bins=10)# ヒストグラムを出力. binsで刻み数を指定
Out[22]:
(array([  975.,   983.,  1030.,  1072.,   995.,  1015.,   959.,   969.,
         1008.,   994.]),
 array([  1. ,   1.9,   2.8,   3.7,   4.6,   5.5,   6.4,   7.3,   8.2,
          9.1,  10. ]),
 <a list of 10 Patch objects>)

各目が大体1000回前後出現した様子が観察できました

今回の宿題:

15面体サイコロを作って,3万回振った結果をplotしてみましょう

ヒント

1. 15面体サイコロをインスタンス化します

2. for文で15000回反復して結果を記録します

3. 結果をhistでプロットします.出目が15個あるので   plt.hist(x,bins=15) などと指定するとよいでしょう.