3: 2016-01-30 (土) 01:49:33 osinko |
現: 2016-05-25 (水) 21:32:47 osinko |
| | | |
| に分ける。これは二項定理の | | に分ける。これは二項定理の |
- | \({ \left( H+T \right) }^{ 3 }\quad =\quad _{ 3 }{ C }_{ 0 }{ H }^{ 3 }T^{ 0 }+_{ 3 }{ C }_{ 1 }{ H }^{ 2 }T^{ 1 }+_{ 3 }{ C }_{ 2 }{ H }^{ 1 }T^{ 2 }+_{ 3 }{ C }_{ 3 }{ H }^{ 0 }T^{ 3 }\) | + | \({ \left( H+T \right) }^{ 3 }\quad \\ =\quad _{ 3 }{ C }_{ 0 }{ H }^{ 3 }T^{ 0 }+_{ 3 }{ C }_{ 1 }{ H }^{ 2 }T^{ 1 }+_{ 3 }{ C }_{ 2 }{ H }^{ 1 }T^{ 2 }+_{ 3 }{ C }_{ 3 }{ H }^{ 0 }T^{ 3 }\\ =\quad \left( \begin{matrix} 3 \\ 0 \end{matrix} \right) { H }^{ 3 }+\left( \begin{matrix} 3 \\ 1 \end{matrix} \right) { H }^{ 2 }T^{ 1 }+\left( \begin{matrix} 3 \\ 2 \end{matrix} \right) { H }^{ 1 }T^{ 2 }+\left( \begin{matrix} 3 \\ 3 \end{matrix} \right) T^{ 3 }\quad \) |
| この右辺の掛け合わせた係数部分を利用する事により各パターン数を抽出できる事を利用する | | この右辺の掛け合わせた係数部分を利用する事により各パターン数を抽出できる事を利用する |
| | | |
| となる。この全パターン数を求める式は | | となる。この全パターン数を求める式は |
| | | |
- | \({ 2 }^{ 3 }\quad =\quad { _{ 3 }{ C }_{ 0 } }+{ _{ 3 }{ C }_{ 1 } }+{ _{ 3 }{ C }_{ 2 } }+{ _{ 3 }{ C }_{ 3 }\quad }=\quad 1+3+3+1\quad =\quad 8\) | + | \(H=1,T=1として\\ { \left( 1+1 \right) }^{ 3 }\quad =\quad _{ 3 }{ C }_{ 0 }{ 1 }^{ 3 }1^{ 0 }+_{ 3 }{ C }_{ 1 }1^{ 2 }1^{ 1 }+_{ 3 }{ C }_{ 2 }1^{ 1 }1^{ 2 }+_{ 3 }{ C }_{ 3 }1^{ 0 }1^{ 3 }\\ { 2 }^{ 3 }\quad =\quad { _{ 3 }{ C }_{ 0 } }+{ _{ 3 }{ C }_{ 1 } }+{ _{ 3 }{ C }_{ 2 } }+{ _{ 3 }{ C }_{ 3 }\quad }=\quad 1+3+3+1\quad =\quad 8 \) |
| | | |
- | となる。ここで問題をもう一度読み返すと | + | となる。補足として二項分布的に考えると以下になる。以下の式の各項の値がそのまま確率になっている事から、二項定理の式が絶大な効果を持っている式である事が理解できる。その力の源泉は平均の値にあり、その式自体が表面上の計算式の影に隠れている事に注目する必要がある |
| + | |
| + | |
| + | \(H=0.5,T=0.5として\\ { \left( 0.5+0.5 \right) }^{ 3 }\quad =\quad _{ 3 }{ C }_{ 0 }0.5^{ 3 }0.5^{ 0 }+_{ 3 }{ C }_{ 1 }0.5^{ 2 }0.5^{ 1 }+_{ 3 }{ C }_{ 2 }0.5^{ 1 }0.5^{ 2 }+_{ 3 }{ C }_{ 3 }0.5^{ 0 }0.5^{ 3 }\\ 1^{ 3 }\quad =\quad \underbrace { { _{ 3 }{ C }_{ 0 } }\frac { 1 }{ 8 } +{ _{ 3 }{ C }_{ 1 } }\frac { 1 }{ 8 } +{ _{ 3 }{ C }_{ 2 } }\frac { 1 }{ 8 } +{ _{ 3 }{ C }_{ 3 }\frac { 1 }{ 8 } \quad } }_{ ここで各項に1/2の3乗が発生している事が突出してこの公式をスゴくさせている } =\quad \frac { 1 }{ 8 } +\frac { 3 }{ 8 } +\frac { 3 }{ 8 } +\frac { 1 }{ 8 } \quad =\quad 1\) |
| + | |
| + | 仮にコインが歪な形をしていて表が60%、裏が40%の確率で出る場合の式は以下になる |
| + | このように有理数で考えると分りやすい |
| + | |
| + | \(H=0.6=\frac { 3 }{ 5 } ,T=0.4=\frac { 2 }{ 5 } として\\ { \left( 0.6+0.4 \right) }^{ 3 }\quad =\quad _{ 3 }{ C }_{ 0 }\left( \frac { 3 }{ 5 } \right) ^{ 3 }\left( \frac { 2 }{ 5 } \right) ^{ 0 }+_{ 3 }{ C }_{ 1 }\left( \frac { 3 }{ 5 } \right) ^{ 2 }\left( \frac { 2 }{ 5 } \right) ^{ 1 }+_{ 3 }{ C }_{ 2 }\left( \frac { 3 }{ 5 } \right) ^{ 1 }\left( \frac { 2 }{ 5 } \right) ^{ 2 }+_{ 3 }{ C }_{ 3 }\left( \frac { 3 }{ 5 } \right) ^{ 0 }\left( \frac { 2 }{ 5 } \right) ^{ 3 }\\ 1^{ 3 }\quad =\quad \underbrace { { _{ 3 }{ C }_{ 0 } }\frac { 27 }{ 125 } +{ _{ 3 }{ C }_{ 1 } }\frac { 18 }{ 125 } +{ _{ 3 }{ C }_{ 2 } }\frac { 12 }{ 125 } +{ _{ 3 }{ C }_{ 3 }\frac { 8 }{ 125 } \quad } }_{ ここで各項に\frac { 1 }{ 5 } の3乗が発生している事が突出してこの公式をスゴくさせている } =\quad \frac { 27 }{ 125 } +\frac { 54 }{ 125 } +\frac { 36 }{ 125 } +\frac { 8 }{ 125 } \quad =\quad 1\) |
| + | |
| + | さて、ここで問題をもう一度読み返すと |
| | | |
| <問題:3枚のコイン投げ> | | <問題:3枚のコイン投げ> |
| このひとつの式から確率を求める計算は非常に難しい「本当に問題と数え方を理解していないと計算ができない」事がよくわかる | | このひとつの式から確率を求める計算は非常に難しい「本当に問題と数え方を理解していないと計算ができない」事がよくわかる |
| では、この求めた値が正当な値であるかunityを使って検証し、その正しさを体感してみる | | では、この求めた値が正当な値であるかunityを使って検証し、その正しさを体感してみる |
| + | |
| + | #code(csharp){{ |
| + | using UnityEngine; |
| + | using System.Collections; |
| + | |
| + | public class Test5 : MonoBehaviour |
| + | { |
| + | |
| + | //求めた確率の値が正しい事を検証する |
| + | void Start() |
| + | { |
| + | //コインを3回投げて |
| + | //「表が1枚以上出ている場合の数」を母数に |
| + | //「表が3枚出ている場合の数」を分子にして |
| + | //確率を10万回のサンプリングで求めている |
| + | print("シミュレーション結果 : " + Pr(100000)); |
| + | print("二項定理の公式利用 : " + ((float)nCr(3, 0) / (float)(nCr(3, 0) + nCr(3, 1) + nCr(3, 2)))); |
| + | } |
| + | |
| + | //指定回数サンプリング後、確率を返す |
| + | private float Pr(int Sampling) |
| + | { |
| + | float deno = 0; |
| + | float nume = 0; |
| + | for (int i = 0; i < Sampling; i++) |
| + | { |
| + | int coin = GetHead(0.5f, 3); |
| + | if (coin >= 1) deno++; //「表が1枚以上出ている場合の数」を母数に |
| + | if (coin == 3) nume++; //「表が3枚出ている場合の数」を分子にして |
| + | } |
| + | return (float)nume / (float)deno; //確率を返す |
| + | } |
| + | |
| + | //指定した「表の確率」で試行回数コイントスし表が出た回数を返す |
| + | 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; |
| + | } |
| + | |
| + | } |
| + | }} |
| + | |
| + | 何度か実行してみて求めた値とシミュレーションの値が近似する事を確かめて欲しい |
| + | |
| + | #navi |