2014-10-24 2 views
2

Можно ли включить начальное семя с помощью метода Math.random в Java? Если да, то как выглядело бы утверждение? Я знаю, как включить начальное семя в класс Random, но как это сделать, если я хочу использовать метод Math.random вместо использования класса Random?Math.random начиная семена

+0

Из [docs] (http://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#random--), я бы сказал, что вы не можете: это создает новый объект Random() при первом вызове с использованием конструктора по умолчанию, поэтому вы застряли с тем, что по умолчанию используется для конструктора no-argument Random() - возможно, текущего времени. – Rup

+1

@Rup: «Когда этот метод сначала называется». Не каждый раз. Но да, ты застрял. Если вам нужно больше контроля, вы должны использовать 'Random' -' Math.random' - это удобство для тех, кто не хочет беспокоиться. – Amadan

+0

Итак, если я использую метод Math.random, у меня нет способа заставить программу выполнить один и тот же набор случайных значений при каждом выполнении? –

ответ

1

JavaDoc к Math.random() читает (частично),

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

new java.util.Random() 

Итак, я считаю, что вам нужно использовать конструктор Random(long) (или позвонить Random.setSeed(long)), если вы хотите установить семя.

0

Невозможно явно выделить Math.random, он получает новый экземпляр Random() при первом вызове с использованием системных часов в качестве семени.

Обратите внимание, что посев как Math.random, так и Random в определенной степени является бесполезным. Math.random - это передний конец Random(). Random() - линейный конгруэнтный генератор, который создает предсказуемую последовательность чисел, если вы знаете какое-либо из чисел, генерируемых последовательностью. Ни Math.random, ни Random не дают числа, которые подходят для приложений, которые нуждаются в непредсказуемости. В этом отношении LCG даже не является статистически случайным. Единственное, что у него есть, это то, что он очень, очень быстрый и, таким образом, полезен для таких вещей, как, скажем, распределение хеш-значений, где предсказуемость не имеет значения (или даже плюс) и несколько случайных «достаточно хороша».

http://en.wikipedia.org/wiki/Linear_congruential_generator

Если вам необходимо криптографически случайное число (то есть тот, который не является предсказуемым, даже если вы знаете, предыдущий номер, который был создан), пожалуйста, используйте реализацию криптографической библиотеки из ГСЧ, не Random() или Math.random. См. Класс JCA SecureRandom. Интернет поблагодарит вас за то, что вы не добавили к большому разнообразию дыр в безопасности, которые затрагивают программное обеспечение, где люди ошибались, думая, что Random() или Math.random генерируют по-настоящему случайный поток чисел.

+0

Вы предполагаете, что OP делает что-то, что требует криптографически защищенных случайных чисел, когда в вопросе нет ничего, чтобы указать что-либо в этом роде. –

+0

Я сказал * ЕСЛИ * ему нужно криптографически случайное число. Я не делал предположений о том, нужен он ему или нет. Пожалуйста, узнайте, как читать. И очень грубо сбрасывать ответ просто потому, что вы не понимаете значения слова «если». –

+0

Я не ответил на ваш ответ, я понимаю смысл слова if, но тон вашего ответа подсказывает, что для типичного использования генераторов случайных чисел нужна безопасность. Некоторые делают, но LCG прекрасно подходят для многих применений, например игр. –

Смежные вопросы