Какой лучший начальный номер для генерации случайных чисел в Java?

Мне нужно генерировать довольно случайные числа в java, но я не хочу повторения результатов каждый раз, когда мой метод вызывает. Рассмотрим этот код:

Random rand = new Random(seed);
if (rand.nextBoolean())
     // do something...

так какое же семя лучше всего использовать?


person Hossein POURAKBAR    schedule 13.03.2016    source источник


Ответы (3)


Вы всегда можете попробовать с System.currentTimeMillis(),

  • меняется со временем, поэтому вы нигде не жестко запрограммируете константы ..
  • вам не нужна какая-либо внешняя зависимость от lib
  • вызывается статически, поэтому создавать объект не нужно
person ΦXocę 웃 Пepeúpa ツ    schedule 13.03.2016
comment
Но это не случайно. Это может быть хорошо для некоторых случаев использования, но, конечно, не для всех. Особенно НЕ используйте это для чего-либо, даже очень похожего на криптографические цели (например, для шифрования данных, генерации паролей и т. Д.) - person Martin Tournoij; 13.03.2016

Разве пустой конструктор Random не использует текущие отметки в качестве начального числа по умолчанию? По крайней мере, это то, что делает C #. Если да, то пустой конструктор ничем не хуже других. В документации для Java только сказано: «Этот конструктор устанавливает для начального числа генератора случайных чисел значение, которое, скорее всего, будет отличаться от любого другого вызова этого конструктора».

Изменить. Вот что я обнаружил:

public Random() { this(++seedUniquifier + System.nanoTime()); }
private static volatile long seedUniquifier = 8682522807148012L;

Однако вы не можете гарантировать случайность. Это псевдослучайно, и кто-то потенциально может вычислить будущие значения на основе предыдущих. Если безопасность не является серьезной проблемой, вы можете просто использовать new Random(). Если вы не используете его неправильно, например, инициализируете его внутри цикла, он должен работать нормально.

person Filkolev    schedule 13.03.2016

Попробуйте что-то вроде этого

Random rand = new Random(System.currentTimeMillis());
if (rand.nextBoolean())
 // do something...
person MDaniyal    schedule 13.03.2016
comment
Но это не случайно. Это может быть хорошо для некоторых случаев использования, но, конечно, не для всех. Особенно НЕ используйте это для чего-либо, даже очень похожего на криптографические цели (например, для шифрования данных, генерации паролей и т. Д.) - person Martin Tournoij; 13.03.2016