第二十四話 乱数の種
俺たちはC言語の乱数の問題に向き合っている。
先輩の話は続く。
「実は普通のコンピューターは厳密には乱数を作れないのよ。特殊な計算で疑似乱数を作っているのに過ぎないわけ。だから、毎回実行するたびに同じ数になるのよ」
「そ、それじゃ、本当の乱数は作れないのか」
「そんなことないよ。巷のゲームじゃ、どれも乱数使ってるでしょ? 疑似乱数計算に使うのは、乱数の種、シードっていうんだけど、それを毎回違った数で初期化したら、結果的に毎回違った数になるわよ。それにはsrand関数を使うの」
先輩は再びコードに書き加える。
/* 数当てゲーム kazuate.c */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
srand((unsigned) time(NULL));
int seikai = rand() % 10 + 1;
・
・
・
「こんどはtime.hですか」
「現在時刻が欲しいからねー。これは毎回実行するたびに違う数でしょ? 同時に二つ実行しない限り、同じ時刻は一つもない。だから、乱数のシード値に使うには最適なのよ」
「時間を使うんですか。なるほどー」と西原さん。
「言うまでもないかもしれないけど、time関数で得られるのよ。あと、このsrand関数の引数はunsigned intしか受け付けないから、timeの戻り値の型をそれに変換しているわ。ここらへんの詳しい話はまた今度ね」
「これで毎回、乱数は違うのか」
「じゃ、実行して検証」
先輩はコンパイルすると実行する。
数を入力してください(1 - 10) : _
「では、2を入れるとー」
数を入力してください(1 - 10) : 2
もっと下です
数を入力してください(1 - 10) : 1
当たりです!
正解は 1 です!
C:¥sample>_
「おおっ。ちゃんと乱数になってる!」
「ためしにもう一度」
先輩は再び実行する。
数を入力してください(1 - 10) : 2
もっと上です
数を入力してください(1 - 10) : 5
もっと上です
数を入力してください(1 - 10) : 8
当たりです!
正解は 8 です!
C:¥sample>_
「これが完成形ね。イツキくん、わかった?」
「はい。もうバッチリですよ」
俺は自信を持って答えた。
どうやら、俺の数当てゲーム、初めて作ったゲームはこれで完成したと言っていいだろう。
先輩の力をかなり借りたのは気にしないでおこう……。
「じゃ、次にもうちょっとこれをゲームらしくしていこうよ」
先輩の言葉に俺は現実へと戻された。
「もっと?」
「たとえばさ、これにスコアを付け加えてみるとか」
「スコアか。それもいいな」
数当てゲームの改造は続くのだ。