[統計] コインで表を1、裏を0とした時に4つ一度に投げた場合に合計がどうなるかの確率を計算

プログラミングの練習がてら、統計的な問題の計算をやってみることにしました。

問題

問題は
  • コインを4つ用意
  •  コインの表を「1」、裏を「0」とする
  • 4つのコインを一度に投げる
  • 4つのコインの裏表を判定して合計を求める
としました。

解説

4つのコインの裏表の組み合わせは「0, 1」で表すと(sumは4つのコインの合計)
  • 0, 0, 0, 0 : sum 0
  • 1, 0, 0, 0 : sum 1
  • 0, 1, 0, 0 : sum 1
  • 0, 0, 1, 0 : sum 1
  • 0, 0, 0, 1 : sum 1
  • 1, 1, 0, 0 : sum 2
  • 1, 0, 1, 0 : sum 2
  • 1, 0, 0, 1 : sum 2
  • 0, 1, 1, 0 : sum 2
  • 0, 1, 0, 1 : sum 2
  • 0, 0, 1, 1 : sum 2
  • 1, 1, 1, 0 : sum 3
  • 1, 1, 0, 1 : sum 3
  • 1, 0, 1, 1 : sum 3
  • 0, 1, 1, 1 : sum 3
  • 1, 1, 1, 1 : sum 4
となります。
全事象の数は2^4 = 16
それぞれの事象を合計(sum)ごとに分けると
  • sum 0 : 1 (6.25%)
  • sum 1 : 4 (25.00%)
  • sum 2 : 6 (37.50%)
  • sum 3 : 4 (25.00%)
  • sum 4 : 1 (6.25%)
となります。合計が2になる確率が最も高く、続いて合計1と3、そして合計1と4が最も低い確率となります。
これを実際にコインを投げてこの確率になるか確かめるわけですが、実際にコインを投げ続けるのは大変過ぎるのでプログラミングを組んでコンピューター上で仮想実験することにしました。

プログラミング

プログラミング言語はPythonを用いました。
コインを投げるにあたっては、randomモジュールのrandint()関数で整数0, 1のいずれかが出る乱数を用いて対応することにしました。

手順としてはまずコインを1回投げる毎に合計を求めます。そして合計0〜4の5つのうちそれぞれ何回出ているのかを求めて、出た回数の確率を求めていきます。
例えば1投目で合計0となったとすれば、
  • sum 0 : 100%
  • sum 1 : 0%
  • sum 2 : 0%
  • sum 3 : 0%
  • sum 4 : 0%
となりますが、2投目で合計2となれば
  • sum 0 : 50%
  • sum 1 : 0%
  • sum 2 : 50%
  • sum 3 : 0%
  • sum 4 : 0%
となります。
延々とコインを投げるプログラミング処理を組んで、コインを投げる処理を延々と繰り返すことで解説で説明した確率になっていくかを調べていきます。

実験結果

数字をずらずらと書いていっても長くなるだけなので、結果をグラフにしたものを示していきます。

100回

100回投げると次のグラフのようになりました。縦軸は出た合計値の確率。横軸はコインを投げた回数となってます。
 この段階ではまだ最も多く出るであろう合計2(赤色)はそれほど大きくはありません。

500回 

500回でそれぞれの確率はだいたいの傾向に落ち着いてるように見えますが、まだ同じ確率になる合計値1(紫色)と3(青色)には差が開いています。

1000回

それほど変化なし

 5000回

グラフからは3000回くらいでほぼ合計値1と3は一致してるように見て取れます。

10000回

ここまで来るとそれぞれの合計値が出る確率はほぼ安定しています。この後100万回まで続けていますが、グラフとしてはほぼ変化はないので結果は省略します。

100万回繰り返した時の確率

最終的に100万回まで繰り返した時のそれぞれの合計値の出た確率は以下のようになりました。
(それぞれ3つ確率があるのは、100万回繰り返す計算を3回行ったため)
  • sum 0 : 6.24%, 6.23%, 6.28%
  • sum 1 : 25.02%, 24.94%, 25.03%
  • sum 2 : 37.46%, 37.62%, 37.55%
  • sum 3 : 25.05%, 24.94%, 24.89%
  • sum 4 : 6.23%, 6.27%, 6.25%
そして解説で求めていた事象の確率と比べてみると、ほぼ同じ値になっていることが分かります。

結論

コンピューター上でのプログラミングによるシミュレーション結果ですが、以上のように統計的な変化を調べることが出来ました。厳密にはプログラミングで使用している乱数がどのように発生されたものなのかも調べて考慮する必要があるのだと思いますが、まぁ簡単に調べる範囲ではこんなものでもいいとは思います。

この結論から何をどうこうするということではありませんが、今後もう少し込み入った計算への取っ掛かりとして今回このように試してみました。あえて何かに利用するとしたら、コイン投げでどの合計値が出るのか当てっコするゲームででも使えるんじゃないかと思います。

コメント

スポンサーリンク


このブログの人気の投稿

Ubuntu Softwareが起動しないのでいろいろと調べてみる(Ubuntu 20.04.1 LTS)

gnuplotでプロットなどの色をcolornameの指定で変更する

Pythonのformat()を使って1桁の16進数でも2桁で出力する方法

MPV(動画再生ソフト)のキーボード操作方法

gnuplot : プロット画像のサイズ指定について(set sizeとの違い)