確率と統計​/幾何分布

Unity学習帳2冊目確率と統計 / 幾何分布

幾何分布 anchor.png

資料:

抽象的、一般的な話を最初にせずに簡単に幾何分布を説明するならば
コインを\(x\)回投げて連続で裏が出続け最後に表が出る確率を表している
この各回の確率の分布状況をグラフで表したものを幾何分布と呼んでいる
prob7.png
緑色のグラフが離散的確率(\(x=1,2,3...\)つまり\(x\in \mathbb{N}\))を表し青色グラフは純粋な確率(実数に対応した確率)を表す

コインの表が出ると成功として考える
1回目で初めて表が出る確率 50%  |○|
2回目で初めて表が出る確率 25%  |×|○|
3回目で初めて表が出る確率 12.5% |×|×|○|
4回目で初めて表が出る確率 6.25% |×|×|×|○| (これは逆に考えると3回連続で裏が出る確率6.25% と言える事に留意)

prob8.png

幾何分布の定義は以下になる

\(\begin{cases} q=(1-p) \\ { P }\left( x \right) =p{ q }^{ x-1 } \end{cases}\)

\(p\quad 命題が成功する確率\)
\(q\quad 命題が失敗する確率\)
\(x\quad 試行回数\)

このケースに幾何分布の定義を利用してみると \({ P }\left( x \right) \quad =\quad \left( \frac { 1 }{ 2 } \right) \cdot \left( \frac { 1 }{ 2 } \right) ^{ x-1 }\quad =\quad \frac { 1 }{ { 2 }^{ x } } \) となり
出力される数列は \({ P }\left( x \right) \quad =\quad \left\{ \frac { 1 }{ 2 } ,\frac { 1 }{ 4 } ,\frac { 1 }{ 8 } ,\frac { 1 }{ 16 } ,\frac { 1 }{ 32 } ,\frac { 1 }{ 64 } ,... \right\} \) となる

話を少し変えてみよう
例えば剣を振って敵を倒すことを考える。敵に対する剣の命中率が85%だったとしよう

この場合、パラメータは以下となり
\(p=0.85=\frac { 17 }{ 20 } \quad ,\quad q=0.15=\frac { 3 }{ 20 }\)

式は以下となる
\( { P }\left( x \right) =\left( \frac { 17 }{ 20 } \right) \cdot \left( \frac { 3 }{ 20 } \right) ^{ x-1 }\)

算出される各確率は以下となる
\({ P }\left( x \right) =\left\{ \frac { 17 }{ 20 } ,\frac { 51 }{ 400 } ,\frac { 153 }{ 8000 } ,\frac { 459 }{ 160000 } ,\cdots \right\} =\left\{ 0.85\quad ,\quad 0.1275\quad ,\quad 0.019125\quad ,\quad 0.00286875\quad ,\quad \cdots \right\} \)

剣が敵にヒットすると成功として考える
1回目で初めて敵にヒットする確率 85%   |○|
2回目で初めて敵にヒットする確率 12.75%  |×|○|
3回目で初めて敵にヒットする確率 1.9125%  |×|×|○|
4回目で初めて敵にヒットする確率 0.286875% |×|×|×|○| (これは逆に考えると3回連続で攻撃が外れる確率は0.2% と言える事に留意)

そして、話をこう変えてみる
例えば剣を振って敵を倒すことを考える。敵に対する剣の命中率が85%だったとしよう
剣が敵に当たらない場合を成功として考えると

この場合、パラメータは以下となり
\(p=0.15=\frac { 3 }{ 20 } \quad ,\quad q=0.85=\frac { 17 }{ 20 } \)

式は以下となる
\({ P }\left( x \right) =\left( \frac { 3 }{ 20 } \right) \cdot \left( \frac { 17 }{ 20 } \right) ^{ x-1 }\)

算出される各確率は以下となる
\({ P }\left( x \right) =\left\{ \frac { 3 }{ 20 } ,\frac { 51 }{ 400 } ,\frac { 867 }{ 8000 } ,\frac { 14739 }{ 160000 } ,\frac { 250563 }{ 3200000 } ,\cdots \right\} =\left\{ 0.15\quad ,\quad 0.1275\quad ,\quad 0.108375\quad ,\quad 0.09211875\quad ,\quad 0.078300937\quad ,\quad \cdots \right\} \)

剣が敵に当たらない場合を成功として考えると
1回目で初めて敵に当たらなかった確率 15%    |○|
2回目で初めて敵に当たらなかった確率 12.75%    |×|○|
3回目で初めて敵に当たらなかった確率 10.8375%   |×|×|○|
4回目で初めて敵に当たらなかった確率 9.211875% |×|×|×|○| 
5回目で初めて敵に当たらなかった確率 7.8300937% |×|×|×|×|○| ??これは逆に考えると4回連続で攻撃がヒットする確率は7.8%(コンボが決まる確率)と言える事に留意

では剣の敵に対する命中率を90%に変えて計算してみるとどうなるだろうか

\(p=0.1=\frac { 1 }{ 10 } \quad ,\quad q=0.9=\frac { 9 }{ 10 } \quad ,\quad \quad { P }\left( x \right) =\left( \frac { 1 }{ 10 } \right) \cdot \left( \frac { 9 }{ 10 } \right) ^{ x-1 }\\ \\ { P }\left( x \right) =\left\{ \frac { 1 }{ 10 } ,\frac { 9 }{ 100 } ,\frac { 81 }{ 1000 } ,\frac { 729 }{ 10000 } ,\frac { 6561 }{ 100000 } ,\cdots \right\} =\left\{ 0.1\quad ,\quad 0.09\quad ,\quad 0.081\quad ,\quad 0.0729\quad ,\quad 0.06561\quad ,\quad \cdots \right\} \)

剣が敵に当たらない場合を成功として考えると
1回目で初めて敵に当たらなかった確率 10%    |○|
2回目で初めて敵に当たらなかった確率 9%    |×|○|
3回目で初めて敵に当たらなかった確率 8.1%   |×|×|○|
4回目で初めて敵に当たらなかった確率 7.29% |×|×|×|○| 
5回目で初めて敵に当たらなかった確率 6.561% |×|×|×|×|○| ??これは逆に考えると4回連続で攻撃がヒットする確率は6.5%(コンボが決まる確率)と言える事に留意

これをグラフにすると武器の性能を視覚的に確認できる

prob9.png

グラフにすると対象の定量的な性質が視覚的に確認できる。試行の8回目で価値観の逆転が起きているのが分かる
実際に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
 
 
 
 
-
|
-
|
|
|
|
|
|
|
-
|
!
|
|
!
|
-
!
-
|
|
-
|
|
!
!
|
-
!
-
|
|
!
!
using UnityEngine;
using System.Collections;
 
public class sc4 : MonoBehaviour
{
    void Start()
    {
        int sampling = 1000000;     //サンプリング回数
        float success = 0.9f;       //成功確率
        int x = 5;                  //x回目で初めて成功する
 
        int total = 0;
        float result = 0;
        for (int i = 0; i < sampling; i++)
        {
            if( TrialAttack(success) ==x)total++;
        }
        result = (float)total / (float)sampling;    //実験から確率の算出
        print(result);
    }
 
    //攻撃試行。無限回数攻撃。攻撃失敗の時点で、それまでの成功回数を返す
    int TrialAttack(float successs)
    {
        int i = 0;
        while (true)
        {
            i++;
            if (Attack(successs) == false) return i;
        }
    }
 
    //攻撃判定。成功確率以内なら真を返す
    public bool Attack(float successs)
    {
        if (Random.value < successs) return true;
        return false;
    }
}

この結果を各値を変更しながら確かめると求めたとおりの答えが得られているのが確認できる



添付ファイル:
fileprob9.png 24件 [詳細] fileprob8.png 22件 [詳細] fileprob7.png 21件 [詳細]

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