サイコロで正規分布を描け
次のプログラムは「いくつかのサイコロを振って、目の和がいくつになったかを集計する」ものです。
先ほど のプログラムと比べて変わったのは、まず3行目、「サイコロ何個の和を求めるか?」つまりは「サイコロを同時に何個投げるか?」を入力するようにしています。
そしてそれと連動して変わったのが5〜7行目です。5行目で「c」という名前のリスト(配列変数)を指定していて、これで集計するのですが、リストの個数は指示していません。サイコロが1個なら目の和は1〜6まで、サイコロが2個なら目の和は2〜12まで、サイコロが3個なら目の和は3〜18までと、必要なリストの個数が変わるからです。
そこで、サイコロの個数を指定した後で、for 文を使って回転させながら、リストを追加(append)しているわけです。7行目「c.append(0)」で「c」という名前のリストに新たに値「0」のリストを追加しています。
1 import random
2 import matplotlib.pyplot as plt
3 m = int(input('何個の和? '))
4 n = int(input('何回振る? '))
5 c=[]
6 for i in range(5*m+1):
7 c.append(0)
8 for i in range(n):
9 d = 0
10 for j in range(m):
11 d = d + int(random.random()*6)
12 c[d] = c[d]+1
13 for i in range(5*m+1):
14 print(i+m,c[i])
15 plt.bar(i+m,c[i])
16 plt.show()
サイコロ1つの場合は先ほど上でやったのと同じで、実行する回数が多ければ、グラフはほぼ平らになりますね。では、サイコロ2つの場合、3つの場合では、グラフはどんな形になるでしょうか。ぜひ実際にやってみてください。そしてできることなら、やる前にグラフがどんな形になるか、予想してみてください。
ところでこの場合も、サンプル数が少ないと偏りますから、少なくとも1,000個、できれば10,000個くらいのサンプル数でやった方がよりくっきりと形が見えるでしょう。
上のプログラムについて、もう少々説明します。「Python の整数は0から始まる」ことは前にも書きましたが、ここでもその影響が出ています。でも、よくよく考えると、むしろ好都合とも言えることです。
現実のサイコロの目は1〜6ですが、前のプログラムでは0〜5として扱いましたね。そのことは、このプログラムではむしろ好都合なのです。というのは、2つのサイコロの目の和は現実には 2〜12 の 11 通りですが、1つのサイコロの目を 0〜5と考えると、2つのサイコロの目は 0〜10 の 11 通りとなります。3つのサイコロの目の和は現実には 3〜18 の 16 通りですが、1つのサイコロの目を0〜5と考えると、3つのサイコロの目は 0〜15 の 16 通りとなります。一般にn個のサイコロの目の和は現実にはn〜 6n の(5n+1) 通りですが、1つのサイコロの目を0〜5と考えると、n 個のサイコロの目は0〜 5n の (5n+1) 通りとなります。そう考えると、サイコロの目を0〜5と考えるのはむしろ合理的のような気もします。
話が長くなりましたが、ぜひ実際に Python で実行してみてください。実際やってみることが大事です。
実際に「サイコロ1個の目 → サイコロ2個の和 → サイコロ3個の和」をそれぞれ10,000回ずつやってみて、グラフにしてみました。結果は下の通りで、サイコロ1個の場合はほぼ直線状に、サイコロ2個の場合は折れ線のように、サイコロ3個の場合は山形のなめらかな曲線状になりました。
その「サイコロ3つの和」のような分布を「正規分布」と言います。足し算するサイコロの個数を4個、5個、…と増やしても、やっぱり正規分布になります。
ところで、正規分布というのは要するに理想形ですから、ぴったり正規分布というものは現実には無いんです。そして、現実に無い正規分布がどういうものかをきちんと説明するには、関数式を示さなければなりません。でもそんなことをすると、正規分布が無意味に難しくなってしまいます。大事なのは、感覚です。
だから、いいんです。先ほどのグラフは厳密には「正規分布に近いグラフ」なのですが、「正規分布だ」と言い切っちゃうことにします。まぁそういうことにしましょう。
別記事にエクセルで実行したものを載せました。よろしければ こちら をどうぞ。
ところで「データ数が増えると正規分布に近づくのか?」というと、必ずしもそうとは限りません。「データ数が増えると正規分布の形から遠ざかる」場合もあります。それについても 同じ記事 に載せましたので、よろしければご覧ください。
◇ ◇ ◇
〜 Python でサイコロを振ってみる 〜
▷ Python でサイコロをモデル化する
▷ サイコロでばらつき具合を体感する
▷ サイコロで正規分布を描け
この記事が気に入ったらサポートをしてみませんか?