2017-02-16 7 views
9

Я работаю над большим школьным проектом о случайных числах, но я не могу найти период для Math.random(). У меня установлена ​​версия 7.0.800.15, и я работаю на компьютере с Windows 10. Я пытался определить период с простой программой, которая сохраняет первые значения:Java Math.random period

double num = Math.random(); 

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

Так что мой вопрос: какой период Math.random() в моей версии? Или: Есть ли способ определить период с помощью простой программы?

Edit: забирал источник, указывающий на страницу о JavaScript, это не имеет отношения

+0

Что вы подразумеваете под периодом? Количество вызовов до тех пор, пока не будет возвращен тот же результат? – Izruo

+0

Ваш вопрос о Java или Javascript? Ссылка говорит о Javascript. – Kayaman

+1

@Izruo К периоду я имею в виду именно это, количество вызовов до тех пор, пока одни и те же цифры не начнут повторяться –

ответ

5

math.random Java использует линейный конгруэнтный генератор с модулем 2^48. Период такого псевдослучайного генератора с хорошо подобранными параметрами равен модулю. По-видимому, параметры на Java выбраны разумно, поэтому на практике период составляет 2^48.

Источники: https://en.wikipedia.org/wiki/Linear_congruential_generator http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml#.WKX-gRJ97dQ

4

вики на linear congruential generator ссылается на Java (java.util.Random) как имеющий модуль 2 . Вероятно, это период, но вам может потребоваться больше узнать об этих типах случайных генераторов.

Этот вопрос (How good is java.util.Random?) также цитирует тот же период.

2

Просто добавьте к другим ответам и более подробно прокомментируйте генераторы случайных чисел и напишите программу, чтобы определить, что такое период, остерегайтесь Birthday Paradox и Gambler's Fallacy. Если вы создадите какое-то значение x, то следующий номер по-прежнему будет как можно скорее x, как и любое другое число, и количество номеров, которое нужно создать, прежде чем вы, вероятно, получите дубликат, на самом деле удивительно мало (это означает, что вы можете , в принципе, начните видеть некоторые дубликаты до конца периода, что затрудняет запись программы для проверки этого).

Вероятность дубликата для вероятности до 50% или около can be approximated по sqrt(2m * p(n)) где p(n) вероятности вы пытаетесь вычисления и m этого число вариантов. Для 32-битного целого числа, sqrt(2m * p(n)) = sqrt(2 * 2^32 * 0.5) = sqrt(2^32) = 65,536. Там у вас это есть - как только вы создадите 65 536 номеров, существует примерно 50-50 вероятность того, что вы создали дубликат.

После того, как вы сгенерировали 2^32 + 1 значения, то Pigeonhole Principle указывает, что вы должны сгенерировали по крайней мере один дубликат (при условии, конечно, что вы генерируя 32-разрядное число).

Вы также можете быть заинтересованы в this question о том, можете ли вы считать случайные числа уникальными.