Java Random seed

#java #testing #random #seed #prng

#java #тестирование #Случайный #начальное значение #prng

Вопрос:

Мне нужно протестировать Java-программу 20 раз и установить случайное начальное значение, чтобы тесты можно было повторить. Если бы я установил начальное начальное значение как 0, а затем увеличивал на 1 при каждом запуске (т. Е. 1,2,3 и т.д.), Этот метод по-прежнему обеспечивал бы полную случайность, даже если начальные значения расположены недалеко друг от друга?

Спасибо

Комментарии:

1. или генерируемые случайные числа будут близки / похожи друг на друга?

2. случайное начальное значение, которое одинаково при каждом запуске тестов? Зачем называть это случайным, это всего лишь начальное значение.

Ответ №1:

Любое начальное значение обеспечит тот же уровень случайности, что и любое другое начальное значение для стандартного PRNG, подобного тому, что входит в состав Java. Поэтому для тестов можно использовать увеличивающееся начальное значение.

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

Комментарии:

1. Нет проблем. Я обновил ответ о том, как получить лучшую случайность, если вас это беспокоит. В любом случае вы можете использовать увеличивающиеся начальные значения для своих тестов, или вы могли бы даже использовать серию случайных чисел (генерируемых из фиксированного начального значения) для использования в качестве начальных значений для каждой итерации 🙂

Ответ №2:

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

Ответ №3:

Почему бы просто не использовать текущее время в качестве начального? т. е. System.currentTimeMillis() ?

Комментарии:

1. потому что мне нужно повторить тесты

2. Позвольте мне перефразировать мой ответ. Если вам нужно повторить тест 20 раз с одной и той же последовательностью случайных чисел, то вам нужно будет использовать одно и то же начальное значение. В противном случае вы можете использовать текущее время в качестве начального значения. Возможно, я неправильно понимаю ваш вопрос?

Ответ №4:

Вам нужно число или строка? Я использую UUID.randomUUID().toString() для получения UUID для своих тестов, когда мне нужны строки, но если вам нужно число, вы можете использовать System.nanoTime() .