見出し画像

高校数学10分プログラミング(数学B編 4.確率分布と統計的な推測)5日目「同時分布を考える」

マガジンリスト > 数学B編 4.確率分布と統計的な推測 > 5日目 課題

おはようございます。

本日は、高校数学10分プログラミング(数学B編 4.確率分布と統計的な推測)の5日目です。

本日の課題は、2つの確率変数$${X,Y}$$に対する同時分布を求めるプログラムを作成することです。


同時分布

まず、同時分布について解説しておきます。

ある試行結果により値の定まる2つの確率変数$${X,Y}$$に対し、$${P(X=x_i, Y=y_j)=p_{ij}}$$とするとき、$${(x_i, y_j)}$$と$${p_{ij}}$$の対応を$${X}$$と$${Y}$$の同時分布という。

$$
\begin{array}{c||cccc|c}
\hline
X \backslash Y & y_1 & y_2 & \cdots & y_m & \mathrm{計} \\
\hline \hline
x_1 & p_{11} & p_{12} & \cdots & p_{1m} & p_1 \\
x_2 & p_{21} & p_{22} & \cdots & p_{2m} & p_2 \\
\vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\
x_n & p_{n1} & p_{n2} & \cdots & p_{nm} & p_n \\
\hline
\mathrm{計} & q_{1} & q_{2} & \cdots & q_{m} & 1 \\
\hline
\end{array}
$$


課題

2枚の硬貨を同時に投げる試行を2回行う。1回目の試行で表の出る枚数を$${X}$$、2回目の試行で表の出る枚数を$${Y}$$とするとき、$${X}$$と$${Y}$$の同時分布を求めるプログラムを作成してください。


アルゴリズム設計 

今回は、2枚の硬貨を同時に投げる試行を2回行うので、計4枚の硬貨の裏表の出方を考えればよいことがわかります。つまり、「1回目の試行での1枚目の硬貨の裏表の2通り×1回目の試行での2枚目の硬貨の裏表の2通り×2回目の試行での1枚目の硬貨の裏表の2通り×2回目の試行での2枚目の硬貨の裏表の2通り」で計16通りの出方について、順に1回目の試行で表の出た枚数と2回目の試行で表の出た枚数とを数えることでそれぞれの場合の数を算出して最後にすべての出方16通りで割って、確率分布を算出することにします。
具体的には、変数$${c_{11}}$$を準備し、1回目の試行の1枚目の硬貨に表が出たら$${c_{11}}$$に 1 を与え、裏が出たら$${c_{11}}$$に 0 を与えるようにします。同様に、1回目の試行の2枚目の硬貨に対して変数$${c_{12}}$$、2回目の試行の1枚目の硬貨に対して$${c_{21}}$$、2回目の試行の2枚目の硬貨に対して$${c_{22}}$$をそれぞれ準備し、表が出たら 1 を与え、裏が出たら 0 を与えるようにします。このように変数を設定すると、1回目の試行で表の出る枚数は

$$
x = c_{11}+c_{12} 
$$

で計算することができ、また、2回目の試行で表の出る枚数は

$$
y = c_{21}+c_{22}
$$

で計算することができます。


プログラム

今回の課題の$${X}$$と$${Y}$$の同時分布を求めるプログラムを示します。

// 2枚の硬貨を同時に投げる試行を2回行う。
// 1回目の試行で表の出る枚数をX、2回目の試行で表の出る枚数をYとするとき、
// XとYの同時分布を求める
void setup(){

  // 2回の試行でのすべての場合の数
  int all_event_num = 2*2*2*2; 
  
  // 場合の数
  int[][] nc = {{0,0,0},{0,0,0},{0,0,0}};//new int[3][3]; 
  // 同時分布P
  float[][] p = new float[3][3];

  int x; // 1回目の試行で表が出た枚数
  int y; // 2回目の試行で表が出た枚数
  for(int c11=0; c11<=1; c11++){ // 1回目の試行での1枚目の裏表
    for(int c12=0; c12<=1; c12++){ // 1回目の試行での2枚目の裏表
      for(int c21=0; c21<=1; c21++){ // 2回目の試行での1枚目の裏表
        for(int c22=0; c22<=1; c22++){ // 2回目の試行での2枚目の裏表
          x = c11+c12; // 1回目の試行での表の数
          y = c21+c22; // 2回目の試行での表の数
          nc[x][y] = 
        }
      }
    }
  }

  // XとYの同時分布を算出する
  for(int i=0; i<=2; i++){
    for(int j=0; j<=2; j++){
      p[i][j] = (float)nc[i][j] / all_event_num;
    }
  }
  
  // 算出した同時分布をコンソールに出力
  for(int i=0; i<=2; i++){
    println(p[i][0],p[i][1],p[i][2]);
  }
}

ソースコード1 $${X}$$と$${Y}$$の同時分布を求めるプログラム(未完成)

ソースコード1では、1回目の試行で表の出る枚数が x 、2回目の試行で表の出る枚数が y となるときの 場合の数 を2次元配列 nc の要素 nc[x][y] で表しています。この 場合の数 の2次元配列 nc が計算できると、あとは 2回の試行でのすべての場合の数 all_event_num で2次元配列 nc のそれぞれの要素を割ってやることで$${X}$$と$${Y}$$の同時分布を求めることができます。
ただし、場合の数 を表す2次元配列 nc を計算する部分は未完成です。

          x = c11+c12; // 1回目の試行での表の数
          y = c21+c22; // 2回目の試行での表の数
          nc[x][y] = 

この計算の部分を追記してソースコード1を完成させてください。

なお、スケッチ名は「SimultaneousDistribution_twoCoins」としてください。


それでは、よろしくお願いします。

MK's papa

いいなと思ったら応援しよう!