確率と統計​/二項分布

Unity学習帳2冊目確率と統計 / 二項分布

二項分布 anchor.png

参考文献「数学ガール 乱択アルゴリズム」のP161よりunityを利用して二項分布の検証を行う
実際に二項分布の公式より導かれた確率の値が正しいものなのかシミュレーションし体感する
まず文献中の問題5-1を具体例にしてみた

表が出る確率が60%(0.6)で、裏が出る確率が40%(0.4)のコインを5回投げる。表が3回出る確率を求めよ。

この問題を解く式は二項分布の公式を利用すると

\(\left( \begin{matrix} 5 \\ 2 \end{matrix} \right) { \times 0.6 }^{ 3 }\times { 0.4 }^{ 2 }\) となる

\(\left( \begin{matrix} 5 \\ 2 \end{matrix} \right) \)は「組み合わせ」を表し、\(_{ 5 }{ C }_{ 2 }\)と同じ意味である。計算すると、

\(\left( \begin{matrix} 5 \\ 2 \end{matrix} \right) { \times 0.6 }^{ 3 }\times { 0.4 }^{ 2 }\quad =\quad \frac { 5\times 4 }{ 1\times 2 } { \times 0.216 }\times 0.16\quad =\quad 10{ \times 0.216 }\times 0.16\quad =\quad 0.3456\quad =\quad 34.56\)%となる

コンピューターによる万単位を超えたオーダーのシミュレーションは非常に有効である。つまり実際にコインを数十万、数百万回投げ表の出る数をかぞえるのは大変だが、unityを利用して疑似的にシミュレーションしてやれば、ほんの一瞬で求めた確率の正当性が確認できる。実際に以下のコードを何度か実行して値を見比べると、その誤差はわずかである。数式の意味を体感する意味で数学とプログラムは同時に勉強した方が絶対に良い

Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
 
 
 
-
-
!
-
-
!
|
!
|
-
!
-
|
|
-
|
!
|
!
|
-
!
-
|
|
-
|
!
|
!
|
-
!
-
|
|
!
|
-
!
-
|
|
|
|
|
-
|
|
!
|
!
!
using UnityEngine;
using System.Collections;
 
public class Test4 : MonoBehaviour
{
    //二項分布をこのプログラムにより検証してみる
    void Start()
    {
        //表が60%の確率で出るコインを5回投げて表が3枚出る確率を10万回のサンプリングで求めている
        print("シミュレーション結果 : " + Pr(0.6f, 5, 3, 100000));
        print("二項分布の公式利用 : " + nCr(5, 2) * Mathf.Pow(0.6f, 3) * Mathf.Pow(0.4f, 2));
    }
 
    //headCountで表が出る回数を指定しサンプリング後、確率を返す
    private float Pr(float headPercent, int tossCount, int headCount, int Sampling)
    {
        float result = 0;
        for (int i = 0; i < Sampling; i++)
        {
            if (GetHead(headPercent, tossCount) == headCount) result++;
        }
        return result / (float)Sampling;    //確率を返す
    }
 
    //指定した「表の確率」で試行回数コイントスし表が出た回数を返す
    private int GetHead(float headPercent, int tossCount)
    {
        int head = 0;
        for (int i = 0; i < tossCount; i++)
        {
            if (TossCoin(headPercent) == true) head++;
        }
        return head;
    }
 
    //指定した表の確率でコイントスして表が出たらtrue、裏でfalseを返す
    public bool TossCoin(float headPercent)
    {
        if (Random.value < headPercent) return true;
        return false;
    }
 
    //組合せ計算
    public int nCr(int n, int r)
    {
        if (n == r || r == 0) return 1;
 
        int deno = n;
        int nume = 1;
        for (int i = 2; i <= r; n--, i++)
        {
            deno *= (n - 1);
            nume *= i;
        }
        return deno / nume;
    }
}

表が出る確率ごとの分布をpocketCasにて計算し最後にすべて加算してみた。総和は\(1\)となる
本の中で「僕」は「これは簡単だね」と言うがテトラは「不思議です」と言った。これはテトラが正しい。難しいから不思議なのだ
2016-01-28 21.51.41.jpg

これは表裏のそれぞれの確率が変わっても同様に総和が\(1\)となる。例えば表が80%。裏が20%でも\(1\)になる。公式の条件である \(p+q=1\) なので当然なのだが…
この世の不思議を一つ知った気になるのは僕だけだろうか?
2016-01-28 21.51.52.jpg

思うに「\(0,1,2,\aleph \)」という数字は哲学的な、原始的な力を持っているらしい。\(2\)があるから人は自分と他人を区別できるし物体の表や裏が区別できるようになる



添付ファイル:

トップ   差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Last-modified: 2016-05-25 (水) 21:32:36 (JST) (2898d) by osinko