Почему моя функция srand(time(NULL)) каждый раз генерирует одно и то же число в c?

Итак, я создавал программу, которая вызывала бы функцию и возвращала 0 или 1 (0 означает решку, а 1 — решку), а затем использовала ее для вывода результатов 100 подбрасываний.

Казалось бы, достаточно просто подумать, что я могу использовать srand(time(NULL)) для заполнения rand() постоянно меняющимися начальными значениями. Вот это была моя первая трещина.

#include <stdio.h>
#include <stdlib.h>
int flip();


int main(void) {

    int heads = 0;
    int tails = 0;

    for (short int count = 1; count <= 100; ++count) {

        int number = flip();

        if (number == 0) {
            printf("%s", "Tails");
            ++tails;
        }
        else if (number == 1) {
            printf_s("%s", "Heads");
            ++heads;
        }

    }//end for
    printf_s("\n%d Tails\n", tails);
    printf_s("%d Heads", heads);
}//end main

int flip(void) {

    srand(time(NULL));
    int number = (int)rand();
    printf("%d", number%2);
    return number%2;
}//end flip

Я запускал программу, и мое значение rand() всегда было пятизначным целым числом, повторяющимся в каждой итерации оператора for (т.е. 15367, 15745 или 15943).

Я бездельничал, пока не обнаружил, что изменение srand(time(NULL)) на srand(time(NULL)*time(NULL)/rand()) помогло.

Моя единственная мысль заключается в том, что время между каждой итерацией настолько мало, что часть времени (NULL) функции srand() не изменяется достаточно, чтобы передать другое начальное значение.

Я также попробовал srand(time(NULL)/rand()), однако это давало один и тот же результат (52 орла и 48 решек) каждый раз, когда я запускал программу (более 20 раз); однако все значения rand() отличались друг от друга.

Я не знаю, почему это произошло, или почему сработала конечная функция srand(time(NULL)*time(NULL)/rand()), и мне бы очень хотелось, чтобы кто-нибудь объяснил!


person Ton    schedule 18.10.2018    source источник
comment
проверьте это: Как я могу генерировать разные случайные числа для каждого игрока?   -  person Sourav Ghosh    schedule 18.10.2018
comment
Обычно вы вызываете srand только один раз, а затем вызываете только rand.   -  person Aconcagua    schedule 18.10.2018
comment
Srand запускает генератор псевдослучайных чисел. Он предназначен для вызова один раз при запуске приложения.   -  person rustyx    schedule 18.10.2018
comment
или этот rand() согласован между несколькими вызовами функций   -  person Sourav Ghosh    schedule 18.10.2018
comment
rand использование с % не дает вам хорошего распределения. Вам лучше использовать return number > RAND_MAX/2; (как правило, number*desiredMax/RAND_MAX — хороший подход — при условии, что вы правильно обрабатываете возможное переполнение).   -  person Aconcagua    schedule 18.10.2018


Ответы (1)


Причина в том, что time(NULL) меняется только раз в секунду! Это означает, что вы 100 раз задаете генератор случайных чисел одним и тем же начальным числом. Лучшим способом является заполнение ГСЧ только один раз в начале процесса (в начале main(), тогда вы должны получить разные значения.

Если вы запускаете свою программу чаще, чем раз в секунду, вы также можете заполнить ее с помощью

srand(time(NULL)+getpid());

или похожие.

person Ctx    schedule 18.10.2018