Bu soru: How to generate a random BigInteger BigIntegers için Random.nextInt (int n) ile aynı semantiği elde etmenin bir yolunu açıklar.Java'da rasgele bir BigDecimal nasıl oluşturabilirim?
Aynı şeyi BigDecimal ve Random.nextDouble() için de yapmak isterim.
Yukarıdaki soruya verilen bir yanıt, rastgele bir BigInteger oluşturulmasını ve ardından rasgele bir ölçekle BigDouble oluşturulmasını önerir. Çok hızlı bir deney, bunu çok kötü bir fikir olarak gösterir :)
Bu yöntemin kullanılması, tamsayı için tamsayıların
n-log10(R)
gibi bir şeyle ölçeklendirilmesini gerektirmesidir. Burada n, gereken sayısal basamak sayısıdır. çıktı ve R rastgele BigInteger'dir. Bu sayede doğru sayıda hanenin bulunmasına izin verilmelidir, böylece (örneğin) 1 -> 10^- 64 ve 10 -> 64 -> 1.
Ölçekleme değerinin, sonuç düşmesi için doğru seçilmesi gerekir. aralığında [0,1].
Daha önce bunu yapan var mı ve sonuçların doğru dağıtılıp dağıtılmadığını biliyor mu? Bunu başarmanın daha iyi bir yolu var mı?
DÜZENLEME: Ölçeğin argümanını anlamamı düzeltmek için @biziclop'a teşekkürler. Yukarıdaki gerekli değildir, sabit bir ölçek faktörü istenen etkiye sahiptir. daha sonra başvurmak, benim (görünüşte çalışan kod) için
geçerli:
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;
}
Yanlış olan orijinal cevabın "rastgele ölçek" kısmıydı. Bu yöntem iyi olmalı. – DJClayworth
Tek bir BigInteger, 10^N'den daha az satın alarak [0, 10^m] ve bunları birleştiren çok sayıda tamsayı oluşturabilirsiniz. –
Doğru, ama bu sorunun ilk cümlesiyle bağlantılı güzel bir cevabı olan karşılık gelen bir soru var. Teklifiniz de işe yarayabilir, özellikle m = 9 ile random.nextInt() kullanılabilir. – maaartinus