Судя по документам Random.nextInt(int n)
, которые, очевидно, должны решить ту же проблему, они, похоже, пришли к выводу, что вы не можете добиться большего успеха, чем "повторная выборка, если она находится вне диапазона", но что Ожидается, что штраф будет незначительным.
Из документов:
Алгоритм немного хитрый. Он отклоняет значения, которые могут привести к неравномерному распределению (из-за того, что 2 31 не делится на n). Вероятность отклонения значения зависит от n. Худший случай - это n = 2 30 + 1, для которого вероятность отклонения равна 1/2, а ожидаемое количество итераций до завершения цикла равно 2.
Я бы посоветовал вам просто использовать рандомизирующий конструктор , который вы упомянули, и выполнять итерации, пока не достигнете значения, которое находится в диапазоне, например, вот так:
public static BigInteger rndBigInt(BigInteger max) {
Random rnd = new Random();
do {
BigInteger i = new BigInteger(max.bitLength(), rnd);
if (i.compareTo(max) <= 0)
return i;
} while (true);
}
public static void main(String... args) {
System.out.println(rndBigInt(new BigInteger("8180385048")));
}
Для вашего конкретного случая (с max = 8180385048), вероятность повторения, даже один раз, составляет около 4,8% , так что не беспокойтесь: -)