Функция srand возвращает те же значения

Эй, ребята, взгляните на эту программу.

/* 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 раза, да?

Мне нужны разные значения каждый раз, когда я бросаю кости, копирую код и запускаю его, чтобы увидеть, что я имею в виду.


person user1971996    schedule 24.01.2013    source источник
comment
Я не знаю, важно ли это для вашей домашней работы, но даже после того, как вы решите проблему, о которой спрашиваете, имейте в виду, что roll = rand() % 13; будет возвращать значения от 0 до 12 включительно. Если предполагается, что вы имитируете два шестигранных кубика, бросок 0 или 1 не годится. И приведение этого выражения к значениям от 2 до 12 также может оказаться недостаточным, поскольку результаты двух игральных костей имеют неравномерное распределение.   -  person Michael Burr    schedule 24.01.2013
comment
@MichaelBurr: Верно. Должно быть (rand()%6) + (rand()%6) + 2;.   -  person David Schwartz    schedule 24.01.2013
comment
@MichaelBurr Хорошим решением для этого было бы просто дважды вызвать (rand() % 6 + 1) и добавить те, которые фактически имитировали бы двойной бросок костей.   -  person RoneRackal    schedule 24.01.2013


Ответы (1)


srand() — это функция, которая устанавливает начальное значение для функции rand(). Здесь вы устанавливаете начальное значение на текущее время перед каждым вызовом rand(), который при достаточно быстром вызове даст вам одно и то же значение (поскольку оно будет сброшено до того же начального значения, которое, если оно будет достаточно быстрым, будет одинаковое значение времени).

Что вам нужно сделать, так это вызвать srand() один раз, когда программа запускается (в начале вашей функции main())

Затем вызывайте rand() каждый раз, когда вам нужно случайное число, как вы это делаете сейчас, но без вызова srand() каждый раз.

person RoneRackal    schedule 24.01.2013
comment
Я согласен, я получил правильный вывод. Большое спасибо. Я хотел сказать это раньше, но у меня пропало интернет-соединение. - person user1971996; 24.01.2013
comment
@ user1971996 Нет проблем :D - person RoneRackal; 25.01.2013