サイコロでばらつき具合を体感する
次のプログラムでは、乱数の他に2つの機能を使っています。1つはグラフを描くための機能、もう1つはリスト機能です。
1行目は 前のプログラム と同じで「乱数の機能」(random module)を読み込む(import)ためのものです。
2行目はグラフを描くための機能(matplotlib.pyplot)を読み込む(import)ためのものです。名前が長いので「plt」という略名で(as)使うことを宣言しています。プログラムの最後、10行目で目の数を棒グラフ(plt.bar)にして、11行目でグラフを表示(plt.show)しています。
サイコロの目の数をカウントしているのは「c」という名前のリスト(配列変数)です。4行目で6個準備して、初期値をいずれも0としました。たとえば3の目が出たら3番目の箱に入れるようなイメージですね。
1 import random
2 import matplotlib.pyplot as plt
3 n = int(input('サイコロを何回振る? '))
4 c = [0,0,0,0,0,0]
5 for i in range(n):
6 d = int(random.random()*6) # d=random.randint(0,5) も同じ
7 c[d] = c[d]+1 # ここで回数をカウントして
8 for i in range(6):
9 print(i+1,c[i])
10 plt.bar(i+1,c[i]) # 回数を棒グラフの値として記憶して
11 plt.show() # 最後にグラフを表示する
ところで、Python では整数は0から始まります。リストで箱を6つ用意しましたが、最初の箱は0番目で、最後の箱は5番目と数えます。それに合わせる意味で、乱数も0〜5の6種類発生させています(6行目:dice の頭文字をとって変数 d とした)。乱数の0がサイコロの1で、… 、乱数の5がサイコロの6という解釈です。8行目の「for i in range(5)」も「0から5までの6回転する」という意味ですから、トータルで考えると上のように解釈するのが良いと判断しました。そして for 文中で最後に結果を表示するところで「i+1」として、現実のサイコロの目と辻褄を合わせたという次第です。
さて、このプログラムでは、最初に「サイコロを振る回数」を指定します。ぜひ「100回投げた場合、1,000回投げた場合、10,000回投げた場合」について、それぞれやってみてください。
そうすれば分かるはずです。「100回くらい投げても、投げるたびにグラフがガタガタと大きく動く」ことに。でも「1,000回くらい投げると、動きがだいぶ小さく」なり、「10,000回も投げると、グラフがほとんど動かなくなる」ことに。
この感覚、大事です。その実習を通して、テレビなどで時々見かける「新橋駅前のサラリーマン100人に聞きました」「原宿の女子高生100人に聞きました」系のアンケートにどの程度の信頼性があるのか(だいぶ誤差があるでしょう)。「5人がダイエットに挑戦して、4人に効果が出ました」系の実験結果を信用してよいのか(統計的にはほとんど何の意味もありません)。そんなことを感じ取ってくれるでしょう。
また、先の例で1000回でほぼフラットになったということは、それ以上サンプルを集めても精度はほとんど変わらないということです。現実にサンプル調査をする場合、人手・経費・時間がかかりますから、どれくらいのサンプル数を集めればよいのか、妥当な線を判断したいところです。
サイコロを実際に100回、1000回、10000回と投げてみることは大事なことです。とはいえ、現物のサイコロをそれだけの回数投げることは現実的ではありません。だから機械にやらせましょう。コンピュータが喜んでやってくれます。
では、ここからさらに 正規分布 へと向かいましょう。
◇ ◇ ◇
〜 Python でサイコロを振ってみる 〜
▷ Python でサイコロをモデル化する
▷ サイコロでばらつき具合を体感する
▷ サイコロで正規分布を描け