java - 如何从 SplittableRandom 获取 nextFloat() ?

标签 java random floating-point

自从听说 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/

相关文章:

java - Java Random 对象可以在同一种子的不同执行中给出不同的结果吗?

php - 生成随机数并保存在数据库中

c - C 中 float 的计算

java - 如何在 Titan DB 1.0.0 版中获取顶点或边元素的属性

Java 随机游走程序?

java - Apache CXF - 以 http 为中心的方法以及从客户端到服务器的 PUT

java - 尽可能接近 0 加倍?

python - 我如何知道要使用什么类型的浮子?

java - 在 Java 中执行 MySQL 查询时出错

java - 无法在spring + maven + tomcat中启动配置文件