2016-03-13 2 views
0

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

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

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

ответ

2

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

  • меняется со временем, так что вы не жестко прописывать константы в любом месте ..
  • вам не нужна какая-либо внешняя Lib зависимости
  • статический под названием, так что нет необходимо создать объект
+0

Но это не случайно. Это может быть хорошо для некоторых случаев использования, но, конечно, не для всех. Особенно НЕ используйте это для чего-либо, даже близко напоминающего криптографические цели (например, шифрование, создание паролей и т. Д.). – Carpetsmoker

2

попробовать что-то вроде этого

Random rand = new Random(System.currentTimeMillis()); 
if (rand.nextBoolean()) 
// do something... 
+0

Но это не случайно. Это может быть хорошо для некоторых случаев использования, но, конечно, не для всех. Особенно НЕ используйте это для чего-либо, даже близко напоминающего криптографические цели (например, шифрование, создание паролей и т. Д.), – Carpetsmoker

4

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

Редактировать: Так вот что я нашел:

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

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