C言語のきほん「数当てゲーム 」当てさせる数をランダムにする(2)乱数の種を設定

スポンサーリンク
プログラミング C言語

前回は、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言語 中級編 柴田 望洋(著)

コメント

タイトルとURLをコピーしました