CO-P10|情報Ⅰ 対策問題
次のプログラムは1〜6の乱数でサイコロを100回振り、1の目が出た回数を数える。空欄【ア】に入るものはどれか。 【関数の説明】 乱数(a, b) … a以上b以下の整数を等しい確率で1つ返す (1) kaisu = 0 (2) i を 1 から 100 まで 1 ずつ増やしながら繰り返す: (3) | me = 乱数(1, 6) (4) | もし 【ア】 ならば: (5) ⎿ ⎿ kaisu = kaisu + 1 (6) 表示する(kaisu)
解答・解説を見る
正解: 1
正答
1
この問題のポイント
乱数シミュレーションの計数(変数に保存してから判定) を問う問題です。
解説
プログラムの流れを確認します。ループ1周が「サイコロを1回振る」ことに対応し、(3)で 乱数(1,6) の結果(出た目)を変数 me に保存、(4)で判定、当たっていれば(5)で kaisu を1増やします。100周で100回振るシミュレーションです。
空欄は直後の処理から逆算します。(5)の「kaisu = kaisu + 1」は「1の目が出た回数を1増やす」処理。これを実行してよいのは「今引いた目が1のとき」、つまり(3)で保存した me が1に等しいときです。よって me == 1 が正解です。
1周分の動きをトレースすると: (3)で乱数が引かれ、たとえば me=3 なら(4)は 3==1 で偽、kaisu はそのまま。me=1 なら真で kaisu が1増える——これが100回繰り返されます。
最大の落とし穴は選択肢4です。条件式の中でもう一度 乱数(1,6) を呼ぶと、(3)で引いた目とは別の新しい乱数が引かれてしまいます。「(3)で3が出たのに、判定用には別の乱数で1が出て数えてしまう」ということが起こり、正しい集計になりません。「乱数は一度変数に受けてから、その変数を使い回す」——これは共通テストのシミュレーション問題(サイコロ、くじ、来客数など)で毎回前提になる最重要の作法です。
選択肢の確認
1.○ (3)で保存した目 me が1かどうかを判定する。
2.× 出た目と回数の比較には意味がない。
3.× i==1 はループの1周目という意味で、目とは無関係。1回しか数えられない。
4.× 判定のたびに乱数を引き直す典型バグ。(3)の目と別の値で判定してしまう。
ここだけは覚えよう
乱数は変数に受けてから使う — 条件式で乱数を呼び直すと「別の目」で判定するバグになる。