Как разные случайные семена должны быть?

Рассмотрим такой код (Python):

import random

for i in [1, 2, 3, 4]:
    random.seed(i)
    randNumbers = [random.rand() for i in range(100)] # initialize a list with 100 random numbers
    doStuff(randNumbers)

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

Для педантов: пожалуйста, поймите, что вышеуказанный код супер-упрощен.

Ответ 1

Короткий ответ: избегайте повторного посева, так как он ничего не покупает здесь. Длинный ответ ниже.


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

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

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

Ответ 2

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

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

Ответ 3

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

В других словах, высевая генератор случайных чисел с определенными заранее определенными семенами, вы фактически уменьшаете случайность системы в целом. Случайные числа, генерируемые при использовании семени 1, действительно psuedo-randomly отличаются от случайных с семенем 2, но твердое кодированное семя приведет к повторным случайным последовательностям в каждом прогоне программы.

Ответ 4

Кажется, вам нужны псевдослучайные числа, которые не являются псевдослучайными, причем более высокая вероятность того, что последовательные числа "значительно" отличаются от псевдослучайности. Я сомневаюсь, что любой общий prng сделает это, независимо от вашей стратегии посева.

Ответ 5

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

Ответ 6

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

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