第二十三話 乱数
「問題?」
立花先輩の言葉に、俺は鸚鵡返しに尋ねた。
「うん。ま、これは見てみる方が早いかなー。とりあえず、コードを改造してみるわね」
先輩はキーボードに触れると、俺の書いたコードに少し書き加えていった。
/* 数当てゲーム kazuate.c */
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int seikai = rand() % 10 + 1;
・
・
・
「stdlib.hですか?」
「この中にrand関数があるの。C言語だと、こういう風に個別に必要な関数の入ったライブラリをインクルードしていくわけ。ちなみにstdlibはスタンダードライブラリの略ね。stdlibは、このrandの他にも、atoi、atol、malloc、free、absとかの関数を使いたいときに加えることが多いわ」
「rand()がランダムですよね?」と西原さん。
「そう。これでランダム、日本語で言うと乱数の値が作られるわけだけど、それに 10を割って、その余りを得るわけ。%記号は、割り算の余りが欲しいときに使うのね」
「なんで余りが要るのかな?」
「イツキくん、よーく考えなさいよ。たとえば15って乱数を得ても、10割って余りを得たら5でしょ? 20だったら、余りは0。19だったら、余りは9。4だったら、そのまま余りも4。ほら、ランダム関数の戻り値がどんな数だったとしても、結果的には0から9の数が得られるじゃない。それに1足したら、1から10の数が得られるわけよ」
「あ、なるほど。よく考えられてるな」
俺は感心した。
数学をもっと勉強しとくべきだったかな。
「これで問題ないわけですね」と西原さんも頷く。
「そうかなー?」先輩は怪しい笑みを口元に浮かべた。
うむむ。先輩がこういう笑みを浮かべたら、いつも問題が起きると俺は学習している。
「ま、すぐわかるわ。とりあえず、実行してみよう」
先輩はコンパイルすると、プログラムを実行した。
C:¥sample>kazuate
数当てゲーム
数を入力してください(1 - 10) :_
「じゃ、5を入力してみるよ」と先輩は5を入れた。
数を入力してください(1 - 10) : 5
もっと下です
数を入力してください(1 - 10) :_
「おっ。結果が違う」
「でしょ? じゃ、今度は1」
数を入力してください(1 - 10) : 1
もっと上です
数を入力してください(1 - 10) :_
「なら、2かなー」
数を入力してください(1 - 10) : 2
当たりです!
正解は 2 です!
C:¥sample>_
「どこも問題無いようだけど」
「じゃ、もう一度やってみるよ」
先輩は再びプログラムを実行する。
数を入力してください(1 - 10) :_
「ここで2をまた入れてみると……」
数を入力してください(1 - 10) : 2
当たりです!
正解は 2 です!
C:¥sample>_
「え……これ、たまたま同じ正解だったとか……」
「じゃ、もう一度」
数を入力してください(1 - 10) : 2
当たりです!
正解は 2 です!
C:¥sample>_
「正解が、2に固定されている!?」
西原さんも驚きの表情を隠せない。
「そう。これが乱数の問題。でも、それを解決する方法があるから、教えるわ」
先輩は話を続けた。