1: 2016-01-28 (木) 20:22:53 osinko |
2: 2016-01-28 (木) 22:43:01 osinko |
- | 二項分布 | + | #jsmath |
| + | **二項分布 [#ued6c064] |
| + | |
| + | 参考文献「数学ガール 乱択アルゴリズム」の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を利用して疑似的にシミュレーションしてやれば、ほんの一瞬で求めた確率の正当性が確認できる。実際に以下のコードを何度か実行して値を見比べると、その誤差はわずかである。数式の意味を体感する意味で数学とプログラムは同時に勉強した方が絶対に良い |
| + | |
| + | #code(csharp){{ |
| + | 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 == 1) 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\)となる |
| + | 本の中で「僕」は「これは簡単だね」と言うがテトラは不思議と言った。不思議だと思う |
| + | &ref(2016-01-28 21.51.41.jpg); |
| + | |
| + | これは表裏のそれぞれの確率が変わっても同様に総和が\(1\)となる。例えば表が80%。裏が20%でも\(1\)になる |
| + | この世の不思議を一つ知った気になるのは僕だけだろうか? |
| + | &ref(2016-01-28 21.51.52.jpg); |
| + | |
| + | 思うに「\(0,1,2,\aleph \)」という数字は哲学的な、根元的な力を持っているらしい。\(2\)があるから比べられるのか |