本题:How to generate a random BigInteger描述了一种为 BigIntegers 实现与 Random.nextInt(int n) 相同语义的方法。
我想对 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;
}
最佳答案
这肯定很容易...如果我只知道你想要什么。对于范围 [0, 1) 和精度为 N 个十进制数字的均匀分布数字,生成小于 10*N 的统一 BigInteger 并将其缩小 10*N。
关于java - 如何在 Java 中创建一个随机的 BigDecimal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4900262/