見出し画像

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

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

おはようございます。

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

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


確率変数と確率分布

まず、確率変数と確率分布について復習しておきます。

確率変数
試行の結果によって値が定まり、その値に対応して確率が定まるような変数。

確率分布

確率変数$${X}$$のとりうる値$${x_k}$$に対して、それが起こる確率$${P(X=x_k)}$$の対応関係。ただし、$${k=1,2,\cdots,n}$$

$$
\begin{array}{c||cccc|c}
\hline
X & x_1 & x_2 & \cdots & x_n & \mathrm{計} \\
\hline
P & p_1 & p_2 & \cdots & p_n & 1 \\
\hline
\end{array}
$$

ここで、$${p_k = P(X=x_k)}$$。
なお、$${p_1 \geq 0, \ p_2 \geq 0, \ \cdots, \ p_n \geq 0 \ : \ p_1+p_2+\cdots+p_n=1}$$である。


課題

2個のさいころを同時に投げて、出る目の小さくない方を$${X}$$とするとき、確率変数$${X}$$の確率分布を求めてコンソールに出力するプログラムを作成してください。


ヒント

計算方法は2個のさいころを同時に投げて、出る目のすべての組合せ(36通り)を考え、出る目の小さくない方が$${x}$$($${x}$$は1から6までの整数の値)となるような場合の数を数えていきます。そして、出る目の小さくない方が$${x}$$となるような場合の数を出る目のすべての組合せの数で割ることで、出る目の小さくない方が$${x}$$となるような確率分布を計算することができます。


プログラム

今回の課題の確率分布を計算するプログラムを示します。

// 2個のさいころを同時に投げて、出る目の小さくない方をXとするときの
// 確率変数Xの確率分布
void setup(){

  // 2個のさいころを同時に投げて、出る目のすべての組合せの数
  int all_event_num = 6*6; 
  
  // 場合の数
  int[] nc = {0,0,0,0,0,0}; 
  // 確率分布P
  float[] p = new float[6];

  // 出る目の小さくない方をXとするときの場合の数
  int x; // 出る目の小さくない方の値
  // 2個のさいころを同時に投げて出る目をx1,x2とする
  for(int x1=1; x1<=6; x1++){
    for(int x2=1; x2<=6; x2++){
      // 出る目の小さくない方をxに代入




      // 出る目の小さくない方がxとなる場合の数を数える
      nc[x-1] = nc[x-1] + 1;
    }
  }
  
  // 場合の数からXの確率分布を算出する
  for(int i=1; i<=6; i++){
    p[i-1] = (float)nc[i-1] / all_event_num;
  }
  
  // 確率変数の値と確率分布をコンソールに出力
  for(int i=1; i<=6; i++){
    println("X:", i, "P:", p[i-1]);
  }
}

ソースコード1 確率分布を計算するプログラム(未完成)

ソースコード1での処理の流れを解説します。
まず最初に、2個のさいころを同時に投げて出る目のすべての組合せの数を all_event_num で表し、$${6 \times 6  (=36)}$$を代入しています。

  // 2個のさいころを同時に投げて、出る目のすべての組合せの数
  int all_event_num = 6*6; 

それから、2個のさいころを同時に投げて出る目の小さくない方は$${1}$$から$${6}$$までの整数の値を取ることを考慮して、出る目の小さくない方に対する場合の数と確率分布をそれぞれ$${6}$$個の成分をもつ配列 nc と p で準備します。なお、配列 nc はそれぞれの成分を$${0}$$で初期化しておきます。

  // 場合の数
  int[] nc = {0,0,0,0,0,0}; 
  // 確率分布P
  float[] p = new float[6];

次に、2個のさいころのうち、1個のさいころの出る目を変数 x1 で表し、もう1個のさいころの出る目を変数 x2 で表して、for ループを用いてそれぞれ$${1}$$から$${6}$$までの値を持たせます。

  for(int x1=1; x1<=6; x1++){
    for(int x2=1; x2<=6; x2++){

そして、この2重ループの中で2個のさいころの出る目の小さくない方を、確率変数を表す変数 x に代入し、 その x に対応した場合の数を数えていきます。

      // 出る目の小さくない方がxとなる場合の数を数える
      nc[x-1] = nc[x-1] + 1;

ここで、配列の引数が$${0}$$から始まることを考慮して、さいころの目 x に対して配列の成分 nc[x-1] が対応するようにしています。

最後に、場合の数 nc から 確率分布 p を計算しています。計算は、場合の数を2個のさいころを同時に投げて出る目のすべての組合せの数 all_event_num で割るだけですが、int 型同士の割り算では正しい結果が得られないので、配列の成分 nc[i-1] を float 型にキャストした上で割り算を行っています。

  // 場合の数からXの確率分布を算出する
  for(int i=1; i<=6; i++){
    p[i-1] = (float)nc[i-1] / all_event_num;
  }


以上の処理で課題の確率分布を計算することができますが、2重ループの中の「2個のさいころの出る目の小さくない方を、確率変数を表す変数 x に代入する」処理を空欄にしています。

  for(int x1=1; x1<=6; x1++){
    for(int x2=1; x2<=6; x2++){
      // 出る目の小さくない方をxに代入




      // 出る目の小さくない方がxとなる場合の数を数える
      nc[x-1] = nc[x-1] + 1;
    }
  }

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

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


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

MK's papa

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