Подтвердить что ты не робот

Генератор случайных чисел - почему семя каждый раз

Я относительно новичок в c и С++. В java, языке, к которому я привык программировать, его очень простое создание случайных чисел. Просто вызовите статический случайный метод из класса Math.

int face = ((int)(Math.random() * 6) + 1);

имитирует бросок кубика...

В c и С++ вы должны "засеять генератор случайных чисел", вызывая функцию srand

srand ( time(NULL) );

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Также обратите внимание, что вам нужно только разделить генератор один раз, в начале программы.

Ответ 4

Преимущество состоит в том, что вы можете повторить последовательность случайных чисел, предоставив одно и то же семя.

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

Ответ 5

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

Попробуйте эти коды и посмотрите разницу.
Без семян:

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

int main()
{
        printf("%d", rand()%6 + 1);
}  

С семенем:

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

int main()
{
        srand(time(NULL));
        printf("%d", rand()%6 + 1);
}

Ответ 6

В C/С++ рулон кости будет моделироваться следующим образом:

int face = (rand() % 6) + 1);
                   ^
                   |___________ Modulo operator

% 6 ограничивает случайное число от 0 до 5, а + 1 делается для смещения предела, поэтому оно становится от 1 до 6.

Ответ 7

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

Я прикрепил небольшой образец из 2 прогонов по 20 записей каждый с семенем 12, чтобы проиллюстрировать сразу же после кода, который их создал:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    srand(12);
   for (int i =0;i<100; i++)
   {
       cout << rand() << endl;
   }
   return 0;
}

two randomly generated sequences both seeded with 12

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

Требования: посев требуется только один раз за уникальную случайную последовательность, которую необходимо создать.

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