Что такое кроссплатформенный способ выбора случайного начального числа в Java? - PullRequest
4 голосов
/ 26 сентября 2008

Прочитав этот ответ: лучший способ выбрать случайный набор из коллекции?

Меня удивило, как выбрать случайное семя в Java?

И не говорите, используйте System.currentTimeMillis () или System.nanoTime (). Прочтите статью, чтобы узнать, почему нет.

Это сложный вопрос, но позвольте мне сделать его сложнее. Допустим, вам нужно сгенерировать случайное начальное число без подключения к Интернету, без использования пользовательского ввода (т.е. нет графического интерфейса пользователя), и оно должно быть кроссплатформенным (поэтому нет JNI для доступа к оборудованию).

Существуют ли переменные JVM, которые мы можем отслеживать как источник нашей случайности?

Можно ли это сделать? Или это невозможно?

Ответы [ 3 ]

6 голосов
/ 26 сентября 2008

Взгляните на Uncommons Maths (полное раскрытие: я написал это). Это должно решить большинство проблем, которые вы когда-либо имели со случайными числами в Java.

Даже если вы не используете его, вы сможете получить некоторые идеи из различных реализаций SeedGenerator , которые он предоставляет. По умолчанию используется / dev / random . Если этого не существует (например, Windows), он либо пытается загрузить данные с random.org , либо использует SecureRandom.generateSeed .

Я думаю, что SecureRandom.generateSeed - лучшее, что вы можете сделать, не полагаясь на какую-либо платформу или Интернет.

0 голосов
/ 26 сентября 2008

Хм, в этой статье говорится, что 32-битные семена плохие, а 64-битные - хорошие. System.currentTimeMillis () - это 64-разрядное начальное число.

0 голосов
/ 26 сентября 2008

Объедините System.currentTimeMillis() с глобальным счетчиком, который вы увеличиваете каждый раз, когда генерируете начальное число. Используйте AtomicLong для счетчика, чтобы вы могли увеличивать с эффективностью и безопасностью потока.

«Объединить» не означает «добавить» или «xor», потому что слишком легко получить дубликаты. Вместо этого хэш. Вы можете усложнить и набить длинный и счетчик, например. 16 байт и MD5 это, но я бы, вероятно, использовал 64-битную версию Adler CRC или какую-то другую 64-битную CRC .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...