自从听说 java 的 SplittableRandom 以来,我一直在使用它,因为它的速度快,而且不需要多线程。然而,尽管它几乎具有 Random 类中的所有方法,但它没有附带 nextFloat()
。这是为什么?
现在,真正的问题是,我将如何创建该 nextFloat
方法?看到 double
生成如下:(来自 JDK 8)
final double internalNextDouble(final double n, final double n2) {
double longBitsToDouble = (this.nextLong() >>> 11) * 1.1102230246251565E-16;
if (n < n2) {
longBitsToDouble = longBitsToDouble * (n2 - n) + n;
if (longBitsToDouble >= n2) {
longBitsToDouble = Double.longBitsToDouble(Double.doubleToLongBits(n2) - 1L);
}
}
return longBitsToDouble;
}
..我希望我可以使用以下代码将其转换为 32 位数字生成;
final float internalNextFloat(final float min, final float max) {
float intBitsToFloat = (this.nextInt() >>> 11) * 1.1102230246251565E-16f;
if (min < max) {
intBitsToFloat = intBitsToFloat * (max - min) + min;
if (intBitsToFloat >= max) {
intBitsToFloat = Float.intBitsToFloat(Float.floatToIntBits(max) - 1);
}
}
return intBitsToFloat;
}
但是,这会返回 0.000000
。我只能假设它在某个地方溢出,在这种情况下我很确定问题出在以下行:
(this.nextInt() >>> 11) * 1.1102230246251565E-16f;
那么,如果没有转换经验(我猜是使用 epsilon),我怎样才能实现我想要的目标?
最佳答案
在我看来,无需太深入地考虑其数学原理,您就可以使用 nextDouble
方法生成所需范围内的 double 型,然后将结果转换为浮点型。
关于java - 如何从 SplittableRandom 获取 nextFloat() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42888737/