C ++ - Случайное семя во время выполнения - PullRequest
6 голосов
/ 02 декабря 2010

Как я могу генерировать разные случайные числа во время выполнения?

Я пробовал

srand((unsigned) time(0));

Но, похоже, я получаю случайное число при каждом запуске программы, но не при каждом выполнении самой функции ...

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

srand((unsigned) time(0));

в начале моей тестовой функции и бинго, но, видимо, нет.

Что бы вы мне предложили сделать?

Ответы [ 3 ]

11 голосов
/ 02 декабря 2010

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

10 голосов
/ 02 декабря 2010

srand ()

Как уже упоминали другие.srand () запускает генератор случайных чисел.Это в основном означает, что он устанавливает начальную точку для последовательности случайных чисел.Поэтому в реальном приложении вы хотите вызвать его один раз (обычно это первое, что вы делаете в main (сразу после установки локали)).

int main()
{
    srand(time(0));

    // STUFF
}

Теперь, когда вам нужно случайное число, просто вызовите rand ().

Юнит-тесты

Переход к юнит-тестированию.В этой ситуации вам не нужны случайные числа.Недетерминированные юнит-тесты - пустая трата времени.Если не получится, как вы воспроизведите результат, чтобы исправить его?

Вы все еще можете использовать rand () в модульных тестах.Но вы должны инициализировать его (с помощью srand ()), чтобы модульные тесты ВСЕГДА получали те же значения при вызове rand ().Поэтому настройка теста должна вызывать srand (0) перед каждым тестом (или некоторой константой, отличной от 0).

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

5 голосов
/ 02 декабря 2010

srand используется для заполнения генератора случайных чисел.«С» означает «семя».Это называется «заполнение», потому что вы делаете это только один раз: после «посадки» вы получаете поток, из которого вы можете вызывать rand столько раз, сколько вам нужно.Не вызывайте srand в начале функции, которая требует случайных чисел.Назовите его в начале программы .

Да, это взлом.Но это хак с очень хорошо документированным интерфейсом.

...