Вполне возможно, что он никогда не вернется в точности равна нулю.Включенный Java PRNG - это 48-битный LCG, из которого только 32 бит используются. Для всех 53 битов double
мантисса должно быть нулевое значение, вам понадобится по крайней мере один вызов next()
, где верхние 32 бита равны нулю, а другая, где большинство из них. (Если я не ошибаюсь, я бы сказал, что этого никогда не случится с тем, как работает генератор, но уже поздно, я устал, и я не буду много на него накладывать).
в документации метода явно указывается, как получены случайные числа, также мало возможностей для других реализаций среды выполнения Java для получения разных результатов. Договор может сказать, что номер, который вы получаете, - от [0, 1). Но на практике существует довольно много значений, которые вы никогда не будете бить (потому что вам нужны два последовательных значения от генератора, которые приводят к линейной зависимости между последовательными значениями - всего 48 бит состояния. Вы не можете генерировать все разные 53-битные комбинации - по крайней мере, не так, как это сделано.).
Конечно, поскольку Math.random()
автоматически семян статического Random
экземпляра, мы могли бы также рассмотреть семена здесь, которые может нужно быть очень специфичны для теста, чтобы работать. И это может означать, что этот точный момент времени может быть несколько десятилетий или тысяч лет.
Был ли ваш профессор СС, говорящий о Java, или, скорее, о чисто математической случайной функции с равным распределением? Поскольку такая функция для действительных чисел колеблется от 0 до 1, не имеет никакой вероятности для 0. Также не для 1. И не для 0,5: вероятность может быть назначена только интервалу. Но это, конечно, неверно для дискретного диапазона чисел, как у нас здесь, в Java ... (я уверен, что он имел в виду;) –
Просто проверьте документацию для Math.random(), он укажет, включен ли он или эксклюзивным. –
Здесь нет ошибки округления.Вы просто получите «double» с 53 равномерно распределенными псевдослучайными битами в своей мантиссе. – Joey