これまでの、「数当てゲーム」では、「当てさせる数=正解」がプログラム中に埋め込まれていた。
このようにあらかじめ正解がわかっていては楽しいとは言えない。
そこで、この値が自動的に変わるようにして、ゲームとしての楽しさをアップさせよう。
なお、本プログラムは、
Windows 11 Home(23H2)上で、 Visual Studio Code(1.92.2)を使用して作成し、gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0で コンパイルしている。
乱数を生成(その1)
//乱数を生成(その1)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int retry; // もう一度
printf("この処理系では0~%dの乱数が生成できます\n",RAND_MAX);
do
{
printf("乱数%d生成しました\n",rand());
printf("もう一度生成しますか?(0)->いいえ(1)->はい:");
scanf("%d",&retry);
} while (retry == 1);
return 0;
}
プログラムを実行すると、まずは、生成できる乱数の「範囲」が表示される。最小値は、0であり、最大値はRAND_MAXの値(処理系依存の値)である。
その後、rand()が返却した乱数値が表示される。
ゲームの度に「当てさせる数」を変えるには乱数が必要である。
この乱数を生成するのが、rand関数である。
この関数が生成する乱数はint型の整数である。
その最小値が0であることは、全処理系で共通である。しかし最大値は処理系に依存するため、<stdlib.h>ヘッダでRAND_MAXという名前のオブジェクト形式マクロとして定義されることになっている。
ところで、このプログラムを何度か実行してみよう。
実行結果1
この処理系では0~2147483647の乱数が生成できます
乱数1804289383生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:1
乱数846930886生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:1
乱数1681692777生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:1
乱数1714636915生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:0
実行結果2
この処理系では0~2147483647の乱数が生成できます
乱数1804289383生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:1
乱数846930886生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:1
乱数1681692777生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:1
乱数1714636915生成しました
もう一度生成しますか?(0)->いいえ(1)->はい:0
このように、いつも同じ乱数の系列が生成されてしまう。
次回では、この点について修正していこう。
(参考)新・明解C言語 中級編 柴田 望洋(著)
コメント