朝の10分プログラミング(15日目、2024年6月21日)解説
本日の課題、おつかれさまでした。
本日の課題であった、確率を計算するプログラムを作成することができたでしょうか。
なお、本日の課題は、以下でした。
1から100までの番号札から1枚を取り出すとき、次の確率を計算するプログラムを作成してください。
(1) 5の倍数の札を取る確率
(2) 5の倍数または8の倍数の札を取る確率
プログラム例
まず、(1)のプログラム例を示しておきます。
// 確率を計算する
void setup(){
int card_num = 100; // 番号札の数
int event_num = 0; // 事象が起こる場合の数
int total_num = 0; // 起こりうるすべての場合の数
for(int i=1; i<=card_num; i++){
if( i%5 == 0 ){ // (1) 5の倍数の札を数える
event_num++;
}
total_num++; // 起こりうるすべての場合の数を数える
}
float p = (float)event_num / (float)total_num; // 確率を計算
println(p); // 確率をコンソールに出力
}
ソースコード1 5の倍数の札を取る確率を計算するプログラムの例
開発環境ウィンドウを立ち上げて、テキストエディタ部分にソースコード1を書き写して、実行ボタンを押してみると、コンソールに 0.2 と出力されることを確かめてみてください(図1)。
この結果は、
$$
\mathrm{5の倍数の札を取る確率} = \frac{5\mathrm{の倍数の札を取る場合の数}}{\mathrm{起こりうるすべての場合の数}}=\frac{20}{100} = 0.2
$$
と一致しています。
また、(2)については、ソースコード1の
if( i%5 == 0 ){ // (1) 5の倍数の札を数える
の部分を、「5の倍数または8の倍数の札を数える」ように、
if( i%5 == 0 || i%8 == 0 ){ // (2) 5の倍数または8の倍数の札を数える
と変更することで「5の倍数または8の倍数の札を取る確率」を計算することができます。実際に、ソースコード1を書き換えて、実行ボタンを押してみると、コンソールに 0.3 と出力されることを確かめてみてください(図2)。
この結果が正しいことは、別途確認してみてください。
解説
場合の数を数えることは、以前の課題でも行ったことなので、問題なくかけたのではないでしょうか。
今回のプログラムのポイントは、場合の数を数えたあとに確率を算出するところだと思います。つまり、ソースコード1の
float p = (float)event_num / (float)total_num; // 確率を計算
の部分です。右辺の各変数の前に「(float)」を入れています。これを入れる意味を理解するために、一度、「(float)」を外して実行してみてください。
図3のように、コンソールには 0.0 と間違った結果が出力されます。これは、変数 event_num や total_num が整数型(int型)の変数であることが原因です。
たとえば、$${20 \div 100}$$の計算を考えてみると、2つの結果が考えられます。1つ目は
$$
20 \div 100 = 0 \ \ \mathrm{あまり} \ \ 20
$$
というもの、2つ目は、
$$
20 \div 100 = 0.2
$$
というものです。変数や値が整数型であった場合、割り算の計算は前者のように計算されます。一方、変数や値が浮動小数点数型であった場合、割り算の計算は後者のように計算されます。
つまり、今回の問題では後者のように計算したいのですが、変数 event_num や total_num が整数型(int型)の変数であったため、前者のように計算され、その商である 0 がコンソールに出力されてしまったというわけです。
これを回避するために、 確率を計算する前に変数 event_num や total_num を整数型(int型)の変数から浮動小数点数型(float型)に変えてやる必要があります。それを行うのは簡単で、int型の変数の前に「(float)」と書いてやるだけでよいです。その結果、図1のように正しい値が得られます。
なお、変数の型を変えることを「キャスト」と呼びます。
今回の課題については、記事『高校数学をプログラミングで解く(数学A編)「1-5 事象と確率」』に詳しい解説を載せていますので、そちらをご覧ください。
また、この記事の下の方に、(2)の問題を「和事象の確率の基本性質」を用いた別の方法も紹介していますので、そちらも確認しておいてください。
今週はここまでです。
来週は、「確率」に関する課題を引き続き行ったあと、後半は図形の問題について扱っていく予定をしています。
来週もよろしくお願いします。
MK’s papa
この記事が気に入ったらサポートをしてみませんか?