最初にパッケージを読みこみます
import random #乱数発生用
import matplotlib.pyplot as plt #ヒストグラム用
次にDiceというサイコロ用クラスを定義します
class Dice:
def shoot(self):
return random.randint(1,6)
この Diceというクラスでは,1~6の整数乱数を発生させる shootというメソッドを定義しています.
このままでは,サイコロを振ることができないので, Diceクラスのオブジェクトをインスタンス化します.
インスタンス化 = オブジェクトの実例を作る,くらいの意味だと考えてください.
sai = Dice() #Diceクラスのインスタンス化
これでsaiという名前のオブジェクトが定義されました. 次にsaiのメソッドを呼び出してみましょう
Diceクラスにはshootしかメソッドがありません.
sai.shoot() #メソッドの呼び出し
3
このように,メソッドを使うには,
オブジェクト名.メソッド名()
のように,「.」のあとに続けてメソッド名を書きます. メソッドが引数をとらない場合は()を最後につけます. 引数がある場合は
オブジェクト名.メソッド名(メソッドの引数)
という具合に使います.
さて,sai.shoot()は実行するたびにサイコロを振るので結果が 異なるので,同じサイコロを五回振ってみましょう
そのためにfor文でサイコロ振りの結果をリストxに記録します
x=[]
for i in range(10): # 10回繰り返し.rrangeで指定
x.append(sai.shoot()) #list用メソッドappendを使う
x #結果の呼び出し
[4, 5, 6, 1, 4, 5, 5, 6, 2, 3]
つぎに,6面体だけでなく,10面体や20面体など好きな面数のサイコロを つくってみましょう
そのためにfaceという引数を使って,面数を選べるサイコロ用クラスを 新たに作ります
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の特徴です.最初はよく書き忘れるので 注意しましょう(わたしもよく忘れます).
ではインスタンス化してみましょう
sai10 = Dice(10) # 10面体サイコロ
This dice has 10 faces
インスタンス化すると「This dice has 10 faces(これは10面体のさいころです)」という メッセージが出てきました.初期化メソッドの2行目でprintするように指定したからです.
では振ってみましょう.10面体さいころなので1~10の数値がでます
sai10.shoot()
6
つぎに20回連続してふってみましょう
x=[]
for i in range(20):
x.append(sai10.shoot())
x
[5, 10, 4, 3, 4, 1, 10, 6, 4, 10, 4, 3, 1, 2, 4, 6, 2, 9, 4, 10]
なお,このappendの使いかたは計算結果を保存するためによく使うので 覚えておいてください
最後にサイコロ振りの結果をヒストグラムで可視化してみましょう.
まず plotをインライン表示するオプションを有効にします
%matplotlib inline
for文でサイコロを1万回振り,各目が何回出たのか調べます
これはhistメソッドが勝手にやってくれます
x=[]
for i in range(10000):
x.append(sai10.shoot())
plt.hist(x,bins=10)# ヒストグラムを出力. binsで刻み数を指定
(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) などと指定するとよいでしょう.