1. ホーム
  2. c

[解決済み] rollDice関数内でsrand(time(NULL))を呼び出すと問題が発生する。

2022-02-19 14:12:33

質問

最初に使用したとき srand(time(NULL))rollDice() 関数は動作しませんでした。しかし、mainの中に入れると、うまくいくのです。なぜでしょうか? そのロジックを教えてください。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int rollDice(void) {
    return (1+rand()%6) + (1+rand()%6);
}
int main(void) {
    int roll;
    srand(time(NULL));          
    roll = rollDice();
    printf("You rolled %d.\n", roll);

    enum Gamestatus {WON,LOST,CONTINUE};
    enum Gamestatus status;

    while(status==CONTINUE){
        printf("You are rolling again: \n");
        printf("You rolled %d\n", roll = rollDice());

        if (targetPoint==roll){
            printf("You win!");
            status=WON;
        }
        else if(7==roll){
            printf("You lost!");
            status=LOST;
        }
        else
            status=CONTINUE;
    }
    return 0;
}

解決方法は?

何百万冊もの本があり、乱数が何列にも並んでいるとします。 乱数を取得する前に、本を選択する必要があります。

本を手に入れたら、乱数を得るために、本から数字を順番に読んでいきます。 本を変えると、別の乱数列が得られる。
同じ本に変更する は、その本の最初の番号からシーケンスを再開します。

srand() 本を選び、最初から乱数を開始する
rand() 選択した本から次の番号を読み取る

もし srand() ループの中で、乱数列を同じ本の先頭から再開していることになります。

解決策:1冊の本を一度選択し、そこからずっと数字を読み続ける。

C言語プログラムでは、"本を選択"しないと、乱数は1番の本からやってくる とか、言い換えると がない場合 srand() を呼び出すと、関数 rand() のように振る舞います。 srand(1) が呼び出されました。