見出し画像

高校数学をプログラミングで解く(数学B編)「4-1 確率変数と確率分布」

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


はじめに

今回は、数学Bで学ぶ「確率変数と確率分布」について、確率変数$${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 = x1;
      if(x2 > x1){
        x = x2;
      }
      // 出る目の小さくない方が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 確率分布を計算するプログラム

このソースコードを、Processingの開発環境ウィンドウを開いて(スケッチ名を「ProbabilityDistribution_twoDice」としています)、テキストエディタ部分に書いて実行します。

図1 スケッチ「ProbabilityDistribution_twoDice」の実行結果

図1のように、確率変数$${X}$$の値と確率分布$${P}$$の値とを

X: 1 P: 0.027777778
X: 2 P: 0.083333336
X: 3 P: 0.1388889
X: 4 P: 0.19444445
X: 5 P: 0.25
X: 6 P: 0.30555555

のようにコンソールに出力します。なお、確率分布の値は分数で表すと順に

$$
\frac{1}{36}, \frac{3}{36}, \frac{5}{36}, \frac{7}{36}, \frac{9}{36}, \frac{11}{36}
$$

となっています。


プログラムの解説1「出る目の小さくない方の選び方」

今回、「2個のさいころを同時に投げて、出る目の小さくない方を$${X}$$とする」という処理を行う必要があります。これは、ソースコード1の以下の部分で行っています。

      // 出る目の小さくない方をxに代入
      x = x1;
      if(x2 > x1){
        x = x2;
      }

この部分を解説しておきます。まず、変数 x に1つ目のさいころの目 x1 を代入しておきます。そして、1つ目のさいころの目 x1 と 2つ目のさいころの目 x2 とを比較して、x2 > x1 であれば「x = x2;」が実行され、x の値は x2 の値で置き換えられます。一方、x2 > x1 でなければ「x = x2;」は実行されず、x の値は x1 の値のままとなります。この処理により、「2個のさいころを同時に投げて、出る目の小さくない方を$${X}$$とする」ことができます。
なお、この部分の処理は以下のようにも書くことができます。わかりやすい方を選んでプログラミングしてみてください。

      // 出る目の小さくない方をxに代入
      if(x2 > x1){
        x = x2;
      } else if(x2 < x1){
        x = x1;
      } else {
        x = x1;
      }


プログラムの解説2「さいころの目と配列の要素の番号」

今回、出る目の小さくない方の値 x (xは1から6までの整数)に対する場合の数や確率分布を配列で表しています。さいころの目は 1 から 6 までの6種類ですので、これらの配列も6つの要素を持つように宣言や領域確保を行っています。

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

ここで一点注意が必要です。それは、さいころの目は 1 から 6 までの値を取るのに対し、配列の要素の番号は 0 から 5 までの値を取るということです。そこで、今回は、さいころの目が 1 に対して配列の要素の番号が 0 、さいころの目が 2 に対して配列の要素の番号が 1 などとなるように、さいころの目 x に対して配列の要素の番号を x-1 と対応付けするようにしました。例えば、ソースコード1の以下の部分はそのような対応付けになっています。

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


プログラムの解説3「キャスト」

ソースコード1で、場合の数( nc )から$${X}$$の確率分布( p )を算出する際には注意が必要です。
配列 nc や変数 all_event_numは数を数えるためにint型(整数型)の変数としていましたので、単純に

nc[i-1] / all_event_num;

としてしまうと、割り算の結果は「0」になってしまいます。これは、整数同士に対して「/」は整数の商を与えることとnc[i-1] $${ \leq }$$ all_event_numであることを考慮すると、割り算の結果は0か1のどちらかとなります。これでは、今回求めたい確率にはなりません。
今回行いたい処理は、割り算でもとくに小数の割り算になります。そこで、整数を小数(浮動小数点数)として扱うようにします。それには、

(float)nc[i-1] / all_event_num;

と、整数型の変数の前に「(float)」を付けて、整数型変数を浮動小数点数型にキャストしておきます。


練習問題

3枚の硬貨を同時に投げるとき、表の出る枚数を$${X}$$とする。
(1) 確率変数$${X}$$の確率分布を求めよ。
(2) $${P(2 \leq X \leq 3)}$$を求めよ。


まとめ

今回は、数学Bで学ぶ「確率変数と確率分布」について、確率変数$${X}$$に対する確率分布を求めるプログラムを作成しました。
今回のプログラムのポイントは、出た目の小さくない方の選び方、さいころの目と配列の要素の番号の対応関係、キャストなどでした。以前の記事(マガジン)『高校数学をプログラミングで解く(数学A編)1.場合の数と確率』を一通り読んで、プログラミングを行ってもらった方には比較的簡単に理解できたのではないでしょうか。そう感じたのであれば、プログラミングのスキルが上がってきた証拠です。今後もどんどんプログラミングをしていきましょう。


参考文献

改訂版 教科書傍用 スタンダード 数学B(数研出版、ISBN9784410209468)


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