3: 2016-01-30 (土) 01:49:33 osinko |
4: 2016-01-30 (土) 03:29:49 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 =\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 \) |
| この右辺の掛け合わせた係数部分を利用する事により各パターン数を抽出できる事を利用する | | この右辺の掛け合わせた係数部分を利用する事により各パターン数を抽出できる事を利用する |
| | | |
| このひとつの式から確率を求める計算は非常に難しい「本当に問題と数え方を理解していないと計算ができない」事がよくわかる | | このひとつの式から確率を求める計算は非常に難しい「本当に問題と数え方を理解していないと計算ができない」事がよくわかる |
| では、この求めた値が正当な値であるか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; |
| + | } |
| + | |
| + | } |
| + | }} |
| + | |
| + | 何度か実行してみて求めた値とシミュレーションの値が近似する事を確かめて欲しい |