2012-04-07 10 views
2

есть несколько способов генерации случайных чисел в JavaДействительно ли случайные числа действительно непредсказуемы в Java?

один из них заключается в следующем:

Random rand=new Random(); 
int randomInteger=rand.nextInt(); 

теперь мой вопрос заключается в следующем: мы можем предсказать следующее случайное число?


отредактирован после 4 ответов:

моя реальная проблема заключается в следующем:

я работаю на Snake Game (откусывание в Linux) и я программирует змея двигаться, теперь Я хочу знать, возможно ли предсказать следующее место появления яблока.

Возможно ли это?

+0

Обновлен мой ответ, чтобы перейти к редактированию. –

ответ

5

Не можете предсказать это, но знаете его абсолютно, , если вы знаете, что именно System.currentTimeMillis вернется, когда вы позвоните new Random(). Это потому, что new Random() является ярлыком для new Random(System.currentTimeMillis()), который устанавливает семя псевдослучайного генератора. (Ну, вот что он сделал, когда я в последний раз смотрел на источник, docs don't actually say он должен использовать это.)if Вы знаете, что семя используется new Random(). Псевдослучайные генераторы детерминированы, если вы знаете семя, вы знаете последовательность. Обновление: смотря на источник Java 6 [у меня нет исходного кода Java 7], по умолчанию семя представляет собой комбинацию числа семян, которое увеличивается при использовании, плюс System.nanoTime. Так что вам нужно знать обо всех этих. Поднимает планку.

Если вы не знать точное значение System.currentTimeMillis() как, когда new Random() происходит семя используется new Random(), то это очень трудно действительно предсказать, что следующее значение будет. Это точка псевдослучайных генераторов. Я не скажу, что это невозможно. Просто действительно, действительно трудно сделать с любой степенью уверенности.


Update после вопроса редактирования: Это возможно, но очень, очень трудно, и с точки зрения делать это таким образом, что позволит игроку улучшить свой результат в игре, я бы скажем, вы можете его игнорировать.

2

«Случайные» числа, порожденные классом Random, генерируются алгоритмически и как таковые действительно являются псевдослучайными числами. Итак, теоретически, вы можете предсказать следующий номер. Знание одного числа, которое произвело Random, или даже ряд чисел, недостаточно для прогнозирования следующего числа; вам также необходимо знать семя, которое использует объект Random, и вам нужно будет следовать его алгоритму генерации псевдослучайных чисел.

Если вы хотите повторить набор «случайных» чисел, вы можете указать свое собственное семя при создании экземпляра Random, например.

Random rand = new Random(1234); // Replace 1234 with any value you'd like 

Каждый раз, когда вы создаете Random с тем же семенем, вы получите ту же серию чисел.Так, например, вы можете написать небольшую программу командной строки, которая создает экземпляр Random с некоторым семенем и печатает список возвращаемых чисел, а затем создает экземпляр Random с тем же семенем в вашем коде. Затем вы узнаете, какие цифры ваш код получит и в каком порядке. Это очень удобно для отладки.

+0

Кроме того, если вам нужны действительно случайные числа, существует ряд доступных в Интернете сервисов, таких как http://www.random.org/, которые вы можете запросить списки случайных чисел на основе природных явлений, таких как атмосферный шум. – MattK

1

На детерминированных устройствах, таких как компьютер, не может быть никаких случайных чисел. Но.

Если вы хотите криптографически защищенного случайного числа, используйте SecureRandom: http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html

Random использует детерминированный алгоритм:

Если два экземпляра Random создаются с одной и той же семени, и в той же последовательности вызовы методов для каждого, они будут генерировать и возвращать идентичные последовательности чисел.

http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#Random

+0

Только если вы знаете, что реализация не использует PRNG под обложками, на что это разрешено. –

0

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

Обратите внимание, что если вы полагаетесь на непредсказуемые номера для обеспечения безопасности, вы должны использовать java.secure.SecureRandom, а не java.util.Random.

0

Как и другие ответы на этот вопрос, можно предсказать случайность java.util.Random, если вы знаете начальное семя.

Если вы работаете в Linux-системе, ознакомьтесь с этими специальными файлами /dev/random и dev/urandom. Считается, что из этих файлов возвращаются «лучшие» случайные числа, случайность зависит от активности клавиатуры, движения мыши и некоторых других экзотических факторов.

Подробнее см. Здесь Wikipedia. Эта страница также говорит, что эквивалентные API существуют в Windows.

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