Если Math.random()*t
меньше 1, то вы получите отрицательный ответ, когда вы берете Math.log(Math.random()*t)
по правилам логарифмов. Это означает, что вы получите отрицательный ответ при делении на Math.log(2)
, потому что это 0.69314718055994530941723212145818. Это отрицательное число, разделенное на положительное число. Ответ отрицательный. maxN - отрицательное число = maxN + что-то положительное, поэтому n больше, чем maxN. Чтобы исправить это приведение Math.random () * t к int и добавьте 1:
int n = maxN -
((int) (Math.log((int)((Math.random() * t)+1))
/ Math.log(2))); // maxN - log2(1..maxN)
Обратите внимание на приведение внутри журнала и добавление 1.
Цель добавления единицы состоит в том, чтобы избежать нуля. Невозможно взять журнал 0. Также без добавления 1 вы никогда не получите maxN внутри журнала, потому что Math.random () никогда не выдаст 1. Кстати, вместо получения 1 половины, 2, четвертого, 3 и восьмого он просто начинается с 0. Это дает 0, половина, 1 четвертое, 2 восьмое и т. д.