Ответ 1
http://docs.oracle.com/javase/6/docs/api/java/util/Random.html:
Экземпляр этого класса используется для создания потока псевдослучайные числа. Класс использует 48-битное семя, которое модифицировано используя линейную конгруэнтную формулу. (См. Дональд Кнут, Искусство Компьютерное программирование, том 3, раздел 3.2.1.)
Если два экземпляра Random созданы с одним и тем же семенем, а для каждой из них выполняется одна и та же последовательность вызовов методов, они будут генерировать и возвращать идентичные последовательности чисел. [...]
Это генератор псевдослучайных чисел. Это означает, что вы фактически не катитесь с кубиками, а скорее используете формулу для вычисления следующего "случайного" значения на основе текущего случайного значения. Для создания используется иллюзия рандомизации a seed
. Семя - это первое значение, используемое с формулой для генерации случайного значения.
По-видимому, случайная реализация javas ( "формула" ) не генерирует более 16 четных чисел в строке.
Это поведение является причиной того, что seed
обычно инициализируется временем. Когда вы начнете свою программу, вы получите разные результаты.
Преимущества такого подхода заключаются в том, что вы можете генерировать повторяемые результаты. Если у вас есть игра, генерирующая "случайные" карты, вы можете вспомнить семя, чтобы восстановить одну и ту же карту, если вы хотите воспроизвести ее, например.
Для истинных случайных чисел некоторые операционные системы предоставляют специальные устройства, которые генерируют "случайность" из внешних событий, таких как mousemovements или сетевой трафик. Однако я не знаю, как использовать те, у кого есть java.
Из документа Java для secureRandom:
Многие реализации SecureRandom представлены в виде псевдослучайных (PRNG), что означает, что они используют детерминированный алгоритм для получения псевдослучайной последовательности из истинного случайного семени. Другие реализации могут создавать истинные случайные числа, а другие может использовать комбинацию обоих методов.
Обратите внимание, что secureRandom делает НЕ гарантию истинных случайных чисел.
Почему изменение семени не помогает
Предположим, что случайные числа будут иметь только диапазон 0-7. Теперь мы используем следующую формулу для генерации следующего "случайного" числа:
next = (current + 3) % 8
последовательность становится 0 3 6 1 4 7 2 5
.
Если вы теперь возьмете семя 3
, все, что вы делаете, это изменить начальную точку.
В этой простой реализации, которая использует только предыдущее значение, каждое значение может появляться только один раз, прежде чем последовательность обернется вокруг и начнется снова. В противном случае будет недостижимая часть.
например. представьте себе последовательность 0 3 6 1 3 4 7 2 5
. Цифры 0,4,7,2 and 5
никогда не будут генерироваться более одного раза (углубление на семя, которое они могут быть сгенерированы никогда), так как после циклов последовательности 3,6,1,3,6,1,....
Упрощенные генераторы псевдослучайных чисел можно рассматривать как перестановку всех чисел в диапазоне, и вы используете семя в качестве отправной точки. Если они более продвинутые, вам придется заменить перестановку списком, в котором одни и те же номера могут появляться несколько раз.
Более сложные генераторы могут иметь внутреннее состояние, позволяя одному и тому же числу встречаться несколько раз в последовательности, так как состояние позволяет генератору знать, где продолжить.