Этот вопрос: Как сгенерировать случайный BigInteger описывает способ достижения той же семантики, что и Random.nextInt (int n) для BigIntegers.
Я хотел бы сделать то же самоедля BigDecimal и Random.nextDouble ().
В одном ответе на предыдущий вопрос предлагается создать случайный BigInteger, а затем создать из него BigDouble со случайным масштабом.Очень быстрый эксперимент показывает, что это очень плохая идея:)
Моя интуиция заключается в том, что использование этого метода потребует масштабирования целого числа до значения, подобного n-log10(R)
, где n - числов выходных данных требуются цифры точности, а R - случайный BigInteger.Это должно обеспечить правильное количество цифр, чтобы (например) 1 -> 10 ^ -64 и 10 ^ 64 -> 1.
Значение масштабирования также должно быть правильно выбрано для результатапопасть в диапазон [0,1].
Кто-нибудь делал это раньше, и знают ли они, правильно ли распределены результаты?Есть ли лучший способ добиться этого?
РЕДАКТИРОВАТЬ: Спасибо @biziclop за исправление моего понимания аргумента масштаба.Выше не требуется, постоянный масштабный коэффициент имеет желаемый эффект.
Для дальнейшего использования мой (очевидно рабочий код):
private static BigDecimal newRandomBigDecimal(Random r, int precision) {
BigInteger n = BigInteger.TEN.pow(precision);
return new BigDecimal(newRandomBigInteger(n, r), precision);
}
private static BigInteger newRandomBigInteger(BigInteger n, Random rnd) {
BigInteger r;
do {
r = new BigInteger(n.bitLength(), rnd);
} while (r.compareTo(n) >= 0);
return r;
}