此问题:How to generate a random BigInteger描述了一种为BigIntegers实现与Random.nextInt(int n)相同的语义的方法。如何在Java中创建随机BigDecimal?
我想为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;
}
这样做的结果是不均匀分布的。我试过了,结果是均匀分布在小数部分的,这意味着10^-27与0.01到0.1之间的数字出现在结果中的可能性相同。 10^-27应该比范围在0.1-0.01之间的数字出现的可能性要小26个数量级 – 2011-02-04 16:25:16
@Mike Houston我错过了显而易见的,因为我仍然不明白。你希望它是否均匀分布? – biziclop 2011-02-04 16:28:24
@Mike Houston Nope,依然不明白。如果采用一个最多n位数的均匀分布的变量,并将其除以10^n,它仍然是均匀分布的。 – biziclop 2011-02-04 16:31:32