Câu hỏi này: How to generate a random BigInteger mô tả cách để đạt được cùng ngữ nghĩa như Random.nextInt (int n) cho BigIntegers.Làm cách nào để tạo một BigDecimal ngẫu nhiên trong Java?
Tôi muốn thực hiện tương tự cho BigDecimal và Random.nextDouble().
Một câu trả lời trong câu hỏi trên gợi ý tạo một BigInteger ngẫu nhiên và sau đó tạo một BigDouble từ nó với một tỷ lệ ngẫu nhiên. Một thử nghiệm rất nhanh cho thấy đây là một ý tưởng rất tồi :)
Trực giác của tôi là sử dụng phương pháp này sẽ yêu cầu số nguyên được chia tỷ lệ bằng một cái gì đó như
n-log10(R)
, trong đó n là số chữ số chính xác được yêu cầu trong đầu ra và R là BigInteger ngẫu nhiên. Điều này sẽ cho phép số lượng chữ số chính xác được hiển thị sao cho (ví dụ) 1 -> 10^-64 và 10^64 -> 1.
Giá trị tỷ lệ cũng cần được chọn chính xác cho kết quả giảm trong phạm vi [0,1].
Có ai đã làm điều này trước đây và họ có biết kết quả được phân phối chính xác không? Có cách nào tốt hơn để đạt được điều này?
EDIT: Nhờ @biziclop để điều chỉnh hiểu biết của tôi về đối số quy mô. Ở trên là không cần thiết, một yếu tố quy mô không đổi có hiệu quả mong muốn.
Để tham khảo sau, tôi (hình như làm việc code) là:
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;
}
Đó là phần "tỷ lệ ngẫu nhiên" của câu trả lời ban đầu sai. Phương pháp này sẽ ổn thôi. – DJClayworth
Bạn có thể tạo một BigInteger thống nhất nhỏ hơn 10^N mua tạo nhiều số nguyên [0, 10^m] và kết hợp chúng. –
Phải, nhưng có một câu hỏi tương ứng với câu trả lời hay được liên kết trong câu đầu tiên của câu hỏi này. Đề xuất của bạn cũng có thể hoạt động tốt, đặc biệt là với m = 9 do đó random.nextInt() có thể được sử dụng. – maaartinus