有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java数学。随机闭双区间

在Java中,如何在闭合区间[x;y]中生成随机双精度值,例如[0;10]?Math.random()的API说它返回[0;1]中的值,因此乘以10(以及乘以11)没有帮助


共 (2) 个答案

  1. # 1 楼答案

    编辑:我已经进一步研究过了

    要获得下一个更高的可能的双倍值,请使用Math.ulp(double)

    double number = 10.0 + Math.ulp(10.0);
    

    10.0的下一个较高值是10.000000000000002

    在生成随机数的情况下:

    double randomNumber = Math.random() * (10.0 + Math.ulp(10.0));
    

    https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#ulp(double)


    我的旧理论是不正确的:

    2e-1074是double类型的最小正非零值。 这个常数是Double.MIN_VALUE。因此10 + 2e-1074Math.random()相乘,理论上会得到一个[0;10]范围内的随机数

    double randomNumber = Math.random() * (10.0 + Double.MIN_VALUE);
    

    用于Double.MIN_VALUE:https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#MIN_VALUE的Java文档

  2. # 2 楼答案

    非常有趣的问题。我可以想出两种方法来尝试。(1) 双浮点数实际上是按指数缩放的整数。[0,10]中有多少不同的双浮点值?您可以在[0,1,2,…n]中生成一个整数,其中n是该数字,然后对其进行缩放以获得浮点值。作为一种附加褶皱,在不同范围内有不同粒度的浮子。我想你们得看看[2^m,2^(m+1)]形式的范围

    (2)拒收方法。找出一种方法来生成大于[0,10]的某个范围内的数字,然后拒绝任何不在该范围内的数字

    祝你好运,玩得开心