見出し画像

高校数学をプログラミングで解く(数学A編)「1-6 独立な試行の確率」


はじめに

今回は、数学Aで学ぶ「独立な試行の確率」について、独立な試行であることを使う場合と使わない場合の確率を計算するプログラムを作成して、比較します。

独立な試行の確率

まず、独立な試行の確率について復習しておきます。

独立な試行の確率
2つの独立な試行$${\mathrm{S, T}}$$を行うとき、$${\mathrm{S}}$$では事象$${A}$$が起こり、$${\mathrm{T}}$$では事象$${B}$$が起こるという事象を$${C}$$とすると、事象$${C}$$の起こる確率は

$$
P(C)=P(A)P(B)
$$

3つ以上の独立な試行についても、同様の等式が成り立つ。

独立な試行の確率を計算する

今回は次のような問題を考えてみます。

問題
1個のさいころを2回投げるとき、1回目に4、2回目に3の倍数の目が出る確率を求めよ。

この問題では、1回目のさいころを投げる試行と2回目のさいころを投げる試行は独立に考えることができるので、確率の計算に確率の積を利用することができます。実際、4の目が出る確率は$${1/6}$$、3の倍数の目が出る確率は$${1/3}$$となるので、1回目に4、2回目に3の倍数の目が出る確率は

$$
\frac{1}{6} \cdot \frac{1}{3} = \frac{1}{18} = 0.055555 \cdots
$$

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

以下で、この確率の計算を2つの方法でプログラミングしていきます。

アルゴリズム設計1「独立な試行であることを利用する場合」

最初は、1回目のさいころの試行と2回目のさいころの試行が独立であることを利用して計算します。つまり、1回目のさいころの目が4となる確率(p_A)と2回目のさいころの目が3の倍数となる確率(p_B)をそれぞれ求めて、最後に、2つの確率を掛け合わせることで、1回目に4、2回目に3の倍数の目が出る確率(p)を計算します。

プログラム1「独立な試行であることを利用する場合」

では、独立な試行の確率を計算するプログラムを作成していきます。

// 1個のさいころを2回投げるとき、1回目に4、2回目に3の倍数の目が出る確率
// 1回目と2回目を独立な試行と考えて確率を計算する
void setup(){
  
  int pip_num = 6; // さいころの目の数
  int event_A_num = 0; // 1回目のさいころの目が4となる場合の数
  int event_B_num = 0; // 2回目のさいころの目が3の倍数となる場合の数
  int total_A_num = 0; // 1回目のさいころの目で起こりうるすべての場合の数
  int total_B_num = 0; // 2回目のさいころの目で起こりうるすべての場合の数
  
  for(int i=1; i<=pip_num; i++){ // 1回目のさいころの目
    if( i == 4 ){ // 1回目のさいころの目に4が出た場合の数を数える
      event_A_num++;
    }
    total_A_num++; // 1回目のさいころの目で起こりうるすべての場合の数を数える
  }
  // 1回目のさいころの目が4となる確率
  float p_A = (float) event_A_num / (float) total_A_num;
  
  for(int j=1; j<=pip_num; j++){ // 2回目のさいころの目
    if( j%3 == 0 ){ // 2回目のさいころの目に3の倍数が出た場合の数を数える
      event_B_num++;
    }
    total_B_num++; // 2回目のさいころの目で起こりうるすべての場合の数を数える
  }
  // 2回目のさいころの目が3の倍数となる確率
  float p_B = (float) event_B_num / (float) total_B_num;
  
  float p = p_A * p_B; // 独立な試行の確率  
  println(p); // 確率をコンソールに出力
}

ソースコード1 独立な試行であることを利用する場合のプログラム

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

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

図1のように、1回目に4、2回目に3の倍数の目が出る確率「0.05555556」($${=1/18}$$ )をコンソールに出力します。

プログラムの解説

ソースコード1において、「2回目のさいころの目が3の倍数となる」ことは「さいころの目の値を3で割ったときの余りが0になる」ことと考えて

j%3 == 0

としています。また、確率の計算では、整数の割り算ではなく小数の割り算を行うために、整数型変数を浮動小数点数型にキャストしています。

  float p_A = (float) event_A_num / (float) total_A_num;
  float p_B = (float) event_B_num / (float) total_B_num;

キャストについての詳細は記事『高校数学をプログラミングで解く(数学A編)「1-5 事象と確率」』をご覧ください。

アルゴリズム設計2「独立な試行であることを利用しない場合」

今度は、独立な試行であることを利用せずに、確率を計算するプログラムを考えてみます。プログラムの流れとしては、1回目のさいころを振り、2回目のさいころを振ったあと、1回目のさいころの目が4、2回目のさいころの目が3の倍数が出たときの場合の数(event_C_num)を数えて、同時に、1個のさいころを2回投げたときに起こりうるすべての場合の数(total_num)を数えておきます。最後に、event_C_num / total_numを計算して確率を求めます。

プログラム2「独立な試行であることを利用しない場合」

では、独立な試行であることを利用しないで確率を計算するプログラムを作成します。

// 1個のさいころを2回投げるとき、1回目に4、2回目に3の倍数の目が出る確率
// すべての事象をカウントして確率を求める
void setup(){
  
  int pip_num = 6; // さいころの目の数
  int event_C_num = 0; // 1回目に4、2回目に3の倍数が出る場合の数
  int total_num = 0; // 起こりうるすべての場合の数
  
  for(int i=1; i<=pip_num; i++){ // 1回目のさいころの目
    for(int j=1; j<=pip_num; j++){ // 2回目のさいころの目
      // 1回目に4が出て、2回目に3の倍数が出た場合を数える
      if( i == 4 && j%3 == 0 ){
        event_C_num++;
      }
      total_num++; // 起こりうるすべての場合の数を数える
    }
  }
  float p = (float) event_C_num / (float) total_num; // 確率を計算 
  println(p); // 確率をコンソールに出力
}

ソースコード2 独立な試行であることを利用しない場合のプログラム

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

図2 スケッチ「probability_TwoDice2」の実行結果

図2のように、1回目に4、2回目に3の倍数の目が出る確率「0.055555556」($${=1/18}$$)をコンソールに出力します。この値はソースコード 1の実行結果と丸め誤差の範囲で一致していることがわかります。つまり、1個のさいころを2回投げる試行は独立な試行であることを改めて確認することができました。

まとめ

今回は、数学Aで学ぶ「独立な試行の確率」について、独立な試行であることを使う場合と使わない場合の確率を計算するプログラムを作成して、比較しました。どちらも丸め誤差を除いて一致しました。
独立な試行の確率を計算する場合、手計算では試行ごとに確率を計算して最後に掛け合わせる方法が間違いを少なくでき、そして計算も簡単だと思います。プログラミングの場合はどうかというと、どちらともいえないというのが正直なところです。
ただ、検算として利用することはできそうです。たとえば、独立な試行と考えて手計算で計算しておき、一方、プログラムで独立な試行であることを利用しないで計算して値が一致するかを確認する。こういう使い方もおすすめです。

参考文献

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

この記事が気に入ったらサポートをしてみませんか?