前回は、rand関数を使って、乱数を生成した。rand関数は、「種」と呼ばれる基準値に演算を施して乱数を作っている。
ところで、このプログラムでは、プログラム実行の度に同じ乱数の系列が生成されていた。
これは、rand関数中に定数値1が種として埋め込まれているからである。
そのため、異なる系列の乱数を生成するには、種の値を変える必要がある。
それを行うのが、srand関数である。
ただし、いったん種が決まると、それ以後に生成される乱数の系列も決まってしまう。
したがって、プログラム実行の度に異なる系列の乱数を生成するには、種の値そのものを、定数でなく、ランダムにしなければならない。
一般的に使われるのが、「プログラム実行時の時刻を種にする」方法である。
それでは、この方法を利用したプログラムをご紹介しよう。
なお、本プログラムは、
Windows 11 Home(23H2)上で、 Visual Studio Code(1.92.2)を使用して作成し、gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0で コンパイルしている。
//乱数を生成(その2:現在の時刻に基づいて乱数の種を設定)
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int retry;
srand(time(NULL));
printf("この処理では0~%dの乱数が生成できます\n",RAND_MAX);
do
{
printf("\n乱数%dを生成しました\n",rand());
printf("もう一度? (0)->いいえ(1)->はい:");
scanf("%d",&retry);
} while (retry == 1);
return 0;
}
実行結果1
この処理では0~2147483647の乱数が生成できます
乱数426986282を生成しました
もう一度? (0)->いいえ(1)->はい:1
乱数2003831143を生成しました
もう一度? (0)->いいえ(1)->はい:1
乱数476599581を生成しました
もう一度? (0)->いいえ(1)->はい:0
実行結果2
この処理では0~2147483647の乱数が生成できます
乱数1564741047を生成しました
もう一度? (0)->いいえ(1)->はい:1
乱数239793563を生成しました
もう一度? (0)->いいえ(1)->はい:1
乱数1248195739を生成しました
もう一度? (0)->いいえ(1)->はい:0
これで、プログラムが起動する度に、異なる系列の乱数が生成されるようになった。
次回は、この仕組みを使って、「数当てゲーム」を改良していこう。
(参考)新・明解C言語 中級編 柴田 望洋(著)
コメント