確率と統計​/確率の基礎2

Unity学習帳2冊目確率と統計 / 確率の基礎2

確率の基礎2 anchor.png

Page Top

case2 anchor.png

白ボール10個、黒ボール3個を一つの袋に入れてよく混ぜ、一つずつ取り出していく。どちらかのボールが袋の中から無くなったら
取り出すのを終了して、袋の中の残りのボールの数を数える。平均何個残るか?

同じように白ボール100個、黒ボール2個を一つの袋に入れてよく混ぜ、一つずつ取り出していく。どちらかのボールが袋の中から無くなったら
取り出すのを終了して、袋の中の残りのボールの数を数える。平均何個残るか?

先に求める式を書いてしまうと以下になる

\(\frac { 1 }{ 3+1 } \times 10+\frac { 1 }{ 10+1 } \times 3\quad =\quad \frac { 10 }{ 4 } +\frac { 3 }{ 11 } \quad =\quad \frac { 110+12 }{ 44 } \quad =\quad \frac { 122 }{ 44 } \quad =\quad 2.772...\)

\(\frac { 1 }{ 2+1 } \times 100+\frac { 1 }{ 100+1 } \times 2\quad =\quad \frac { 100 }{ 3 } +\frac { 2 }{ 101 } \quad =\quad \frac { 10100+6 }{ 303 } \quad =\quad \frac { 10106 }{ 303 } \quad =\quad 33.353...\)

前者が2.772個。後者の問題が33.353個となる
では、unityでシミュレーションして、この求めた値が正しいか検証、体験、実感してみる
シミュレーションでは試行を10万回繰り返し平均値を求めている

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
 
 
 
 
 
-
|
|
-
|
|
|
|
|
|
-
!
 
-
!
-
|
|
-
|
!
|
!
 
-
!
-
|
|
|
|
|
|
-
|
|
|
|
|
|
!
|
-
!
-
|
-
|
!
|
|
|
!
|
|
!
 
-
!
-
|
|
-
|
|
!
-
|
-
|
|
|
|
!
!
|
|
!
 
-
!
-
|
-
|
!
|
|
-
|
!
!
!
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
 
public class Test6 : MonoBehaviour
{
 
    void Start()
    {
        print("計算で求めた値:" + (10f / (3f + 1f) + 3f / (10f + 1f)));
        print("シミュレーション値:"+Sampling(10, 3, 100000));
 
        print("計算で求めた値:" + (100f / (2f + 1f) + 2f / (100f + 1f)));
        print("シミュレーション値:" + Sampling(100, 2, 100000));
 
        //Rest(10, 3,true);
    }
 
    //サンプリングして平均値を返す
    float Sampling(int whiteBall, int blackBall, int loopCount)
    {
        int rest = 0;
        for (int i = 0; i < loopCount; i++)
        {
            rest += Rest(whiteBall, blackBall);
        }
        return (float)rest / (float)loopCount;
    }
 
    //シミュレーション。残り個数を返す
    int Rest(int whiteBall, int blackBall,bool debug=false)
    {
        int whiteCount = 0;
        int blackCount = 0;
        int pointer = 0;
 
        bool[] quary = ShuffleBall(whiteBall, blackBall);
        for (int i = 0; i < quary.Length; i++)
        {
            pointer++;
            if (quary[i] == true) whiteCount++;
            else blackCount++;
 
            if (whiteCount >= whiteBall) break;
            if (blackCount >= blackBall) break;
        }
 
        //参考用(中身を視覚的に確認できる)
        if (debug)
        {
            foreach (var item in quary)
            {
                print(item);
            }
            print(quary.Length);
            print(pointer);
            print(quary.Length - pointer);
        }
 
        return quary.Length - pointer;
    }
 
    //標本空間上のボールをシャッフル
    bool[] ShuffleBall(int whiteBall, int blackBall)
    {
        bool[] query = GetBall(whiteBall, blackBall).ToArray();
 
        //書籍「ゲームの作り方unityで覚える遊びのアルゴリズム」よりP114のシャッフルアルゴリズムの応用
        //念のため3回全体シャッフルしている
        //(3回以下だとこのアルゴリズムでは偏りがあった)
        for (int j = 0; j < 3; j++)
        {
            for (int i = 0; i < query.Length - 1; i++)
            {
                int pointer = Random.Range(i + 1, query.Length);
                bool temp = query[pointer];
                query[pointer] = query[i];
                query[i] = temp;
            } 
        }
 
        return query;
    }
 
    //白玉と黒玉の標本空間を作成
    IEnumerable<bool> GetBall(int whiteBall, int blackBall)
    {
        for (int i = 0; i < whiteBall; i++)
        {
            yield return true;  //trueが白玉
        }
 
        for (int i = 0; i < blackBall; i++)
        {
            yield return false;  //falseが黒玉
        }
    }
}

<実行値の一例>
計算で求めた値:2.772727
シミュレーション値:2.76931
計算で求めた値:33.35313
シミュレーション値:33.3682

この様に値が正しい事が実際に体験し確認できた。では、これが何故正しい値になるのか理屈で考えてみる…



添付ファイル:

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