这个问题:如何生成一个大整数随机数描述了一种实现与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纠正了我的比例参数的理解。上面的方法不必要,恒定的比例因子可以产生期望的效果。
供以后参考,我的(显然有效的)代码是:
我想对于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;
}