2019年6月1日土曜日

[Python] サイコロ投げ

等確率で出るサイコロの目をPythonで再現するには,ランダムに要素を取り出す関数 np.random.choice を用います.
>>> import numpy as np
>>> np.random.choice(np.arange(1, 7), 10)
array([5, 6, 3, 2, 1, 4, 3, 3, 2, 2])
>>> 

np.arange(1, 7) は,標本空間$Omega$がnp.arange(1, 7) = array([1, 2, 3, 4, 5, 6]) であることを表します.ここで,オプションとして replace=True とすると,復元抽出($Omega$から同じ要素を何度でも取り出すことが可能)によるサンプリングとなります.
>>> np.random.choice(np.arange(1, 7), 10, replace=True)
array([4, 6, 3, 6, 2, 4, 3, 6, 4, 5])
>>> 

replace=Trueとした場合は,非復元抽出によるサンプリングとなります(非復元抽出なので,サンプリングの回数に注意が必要).
>>> np.random.choice(np.arange(1, 7), 5, replace=False)
array([2, 5, 6, 4, 1])
>>> 

上記の np.random.choice では,偏りのないサイコロ(各目が等確率ででる)での試行が再現されています.
偏りのあるサイコロの場合は,pオプションを使います.
>>> p = np.array([1, 1, 1, 3, 3, 3]); p = p / np.sum(p)
>>> np.random.choice(np.arange(1, 7), 10, p = p)
array([4, 6, 4, 1, 6, 5, 6, 4, 5, 5])
>>> 

pオプションの記載の仕方は上記の例のように,([1, 1, 1, 3, 3, 3]) において1〜6の各目が出る確率を 1: 1: 1: 3: 3: 3 の比率に設定しています.また,pオプションに渡す配列は確率を表すために,総和が 1 になるように規格化する必要があります.
確率値で表すと,各目の出る確率は 1/12, 1/12, 1/12, 3/12, 3/12, 3/12 となります.
この設定を反映して,実行結果でも4, 5, 6の目が多く出ていることを確認できます.

上記の例のJupyter Notebookファイルは,GitHubStatistics.ipynbの"Throw the dice"で見ることができます.

0 件のコメント :

コメントを投稿