0

皆さん、この番組を見てください。

/* The craps game, KN king page 218 */

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

int roll_dice(void);
bool play_game(void);

int roll_dice(void)
{
    int roll;

    getchar();
    srand((unsigned) time(NULL));

    roll = rand() % 13;

    if(roll == 0)
    roll = roll + 1;

    return roll;
}

bool play_game()
{
    int sum = 0, wins = 0, loss = 0, point;

    sum = roll_dice();

    printf("You rolled: %d", sum);

    if(sum == 7 || sum == 11)
    {
        printf("\nYou won!\n");
        return true;
    }

    if(sum == 2 || sum == 3 || sum == 12)
    {
        printf("\nYou lost!!");
        return false;
    }

    point = sum;

    printf("\n\nYour point is: %d", point);

    do
    {
        sum = roll_dice();
        printf("\nYou rolled: %d", sum);

    }while(sum != point);

    if(sum == point)
    {
        printf("\nYou won!!!");
        return true;
    }

}

int main()
{
    char c, wins = 0, losses = 0;
    bool check;

    do
    {
        check = play_game();

        if(check == true)
          wins++;

        else if(check == false)
          losses++;

        printf("\nPlay Again? ");
        scanf("%c", &c);

    }while(c == 'Y' || c == 'y');

    printf("\nWins: %d      Losses: %d", wins, losses);

    return 0;
}

srand 関数は同じ値を 3 回または 4 回返し続けます。

サイコロを振るたびに異なる値が必要で、コードをコピーして実行して意味を確認します

4

1 に答える 1

9

srand() は、rand() 関数のシードを設定する関数です。ここで行っているのは、呼び出すすべての rand() の前にシードを現在の時刻に設定することです。これは、十分に速く呼び出された場合、同じ値を取得します (同じシードにリセットされるため、十分に高速な場合は同じ時間値)。

やりたいことは、プログラムの開始時 (main() 関数の開始時) に srand() を 1 回呼び出すことです。

次に、現在行っているように、乱数が必要になるたびに rand() を呼び出しますが、毎回 srand() を呼び出す必要はありません。

于 2013-01-24T05:12:58.630 に答える