использование рэнда для генерации случайных чисел

gcc 4.4.4 c89

Я использую код ниже. Однако я продолжаю получать то же число:

    size_t i = 0;

    for(i = 0; i < 3; i++) {
        /* Initialize random number */
        srand((unsigned int)time(NULL));
        /* Added random number (simulate seconds) */
        add((rand() % 30) + 1);
    }

Я хотел бы добраться от 0 до 30, возвратился. Однако в прошлый раз, когда я выполнил это, я добрался 17 три раза.

Большое спасибо,

8
задан ant2009 1 July 2010 в 16:13
поделиться

6 ответов

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

Вам нужно переместить начальную функцию за пределы цикла:

/* Initialize random number */
srand((unsigned int)time(NULL));

for(i = 0; i < 3; i++) {
    /* Added random number (simulate seconds) */
    add((rand() % 30) + 1);
}
21
ответ дан 5 December 2019 в 04:54
поделиться

Вам нужно вызвать srand только один раз, в начале вашей программы.

srand инициализирует генератор псевдослучайных чисел, используя время в секундах. Если вы инициализируете его определенным числом, вы всегда будете получать одну и ту же последовательность чисел. Вот почему вы обычно хотите инициализировать его вначале, используя время (чтобы начальное число было другим каждый раз, когда вы запускаете программу), а затем использовать только rand для генерации чисел, которые кажутся случайными.

В вашем случае время не меняется от итерации к итерации, поскольку ее разрешение составляет всего 1 секунду, поэтому вы всегда получаете первое число псевдослучайной последовательности, которое всегда одно и то же.

9
ответ дан 5 December 2019 в 04:54
поделиться

Вам нужно сделать srand ( (unsigned int) time (NULL)) только один раз перед циклом.

4
ответ дан 5 December 2019 в 04:54
поделиться

Начальное значение генератора псевдослучайных чисел должно вызываться только один раз вне цикла. Использование времени как семени - это хорошо. Однако есть возможность получить такое же случайное число.

1
ответ дан 5 December 2019 в 04:54
поделиться

Вполне возможно, что 3 раза по 17 все еще абсолютно случайны.

Существует примерно 1 к 10 шанс получить два одинаковых числа при использовании диапазона от 1 до 30 и трех вариантов. (это связано с проблемой дня рождения )

Теперь, получение трех одинаковых результатов имеет вероятность 1 к 900 при использовании того же диапазона.

Возможно, вы захотите прочитать дополнительную информацию на странице анализа на сайте random.org

2
ответ дан 5 December 2019 в 04:54
поделиться

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

Что-то вроде


struct timeval tv;
...
gettimeofday(&tv, NULL);
srand(tv.tv_usec);
...

Этот подход может добавить больше энтропии в ваш код генерации псевдо-чисел. ИМХО конечно

Ciao ciao

1
ответ дан 5 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: