首页 > 解决方案 > Java Math.random 闭双区间

问题描述

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

标签: javarandom

解决方案


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

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

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

下一个更高的值10.010.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_VALUE10 + 2e-1074因此,理论上与should相乘Math.random()会给您一个 [0;10] 范围内的随机数

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

Java 文档Double.MIN_VALUEhttps ://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#MIN_VALUE


推荐阅读