Функция srand в C++

Этот код

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

int main ()
{
    printf ("First number: %d\n", rand() % 100);
    srand ( time(NULL) );
    printf ("Random number: %d\n", rand() % 100);
    srand ( 1 );
    printf ("Again the first number: %d\n", rand() %100);

    return 0;
}

имеет следующий вывод:

First number: 41
Random number: 13
Again the first number: 41

Существует также следующее правило:

Две различных инициализации с тем же семенем, дает псевдослучайному генератору команду генерировать ту же последовательность результатов для последующих вызовов к рэнду в обоих случаях.

Я понимаю слова, но я просто не понимаю сам метод. Почему это возвращалось 41 снова? Это случайно, или это должно возвратить тот же результат в каждом случае согласно этому коду?

6
задан Peter Mortensen 10 September 2010 в 18:49
поделиться

6 ответов

Если вы вызываете rand () без первого вызова srand () , поведение будет таким, как если бы вы вызывали srand () с 1 в качестве аргумента.

Это поведение определено в исходном стандарте C. У меня нет под рукой полной копии, но стандарты POSIX Open Group - следующая лучшая вещь, поскольку они включают полный стандарт C (с некоторыми расширениями):

http://www.opengroup.org/ onlinepubs / 000095399 / functions / rand.html

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

Фактический результат rand ( ) для любого заданного начального числа определяется реализацией, за исключением того, что для любого начального числа x вызовите n в rand () после заполнения генератор должен возвращать тот же результат. Таким образом, в вашей реализации вы всегда будете получать 41 при первом вызове rand () после вызова srand (1) , и вы всегда будете получать тот же результат (каким бы он ни был) для второй вызов rand () , другие реализации могут использовать другой алгоритм, который дает другие результаты.

7
ответ дан 8 December 2019 в 17:18
поделиться

Стандарт C ++ подчиняется стандарту C для rand и srand (см. Раздел 26.8 C ++ 0x):

rand Функция имеет семантику, указанную в стандарте C, за исключением того, что реализация может указывать, что определенные библиотечные функции могут вызывать rand .

Стандарт C (7.20.2.2 of C99) утверждает довольно категорично:

Если rand вызывается до того, как будут выполнены какие-либо вызовы srand , такая же последовательность должна быть генерируется как когда srand сначала вызывается с начальным значением 1.

Итак, когда вы в первый раз вызываете rand , начальное значение равно 1. Это также 1 при третьем вызове именно поэтому вы получаете такое же значение.

При втором вызове rand начальное число было установлено на основе текущего времени, поэтому вы получили другой результат. Обычно не рекомендуется повторно заполнять генератор случайных чисел, если вы действительно не хотите той же последовательности (например, при тестировании).

7
ответ дан 8 December 2019 в 17:18
поделиться

Вызов srand со значением 1 сбрасывает генератор в исходное состояние при запуске программы.

0
ответ дан 8 December 2019 в 17:18
поделиться

Я думаю, это может быть проблемой:

Если seed установлено в 1, генератор повторно инициализируется до своего начального значения и выдает те же значения, что и перед любым вызовом rand или srand .

srand ссылка

0
ответ дан 8 December 2019 в 17:18
поделиться

Это, вероятно, связано с тем, что в вашем первоначальном вызове rand генератор случайных чисел не был заполнен, поэтому он использует значение по умолчанию 1 для его заполнения.

0
ответ дан 8 December 2019 в 17:18
поделиться

srand (3) позволяет получать повторяемые выходные данные от генератора случайных чисел. Таким образом, вы можете писать программы, которые зависят от случайных чисел, но тестируют их детерминированно. (Обычно при наличии параметра командной строки для вызова srand () с предоставленным аргументом, поэтому его можно запускать сотни раз с 1, 2, 3, 4, 5, ... в качестве входных данных. )

Итак, это работает так, как ожидалось.

0
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

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