Java数学。随机闭双区间 8 月,3 周 Questions & Answers 186 在Java中,如何在闭合区间[x;y]中生成随机双精度值,例如[0;10]?Math.random()的API说它返回[0;1]中的值,因此乘以10(以及乘以11)没有帮助
# 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-1074与Math.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 楼答案 非常有趣的问题。我可以想出两种方法来尝试。(1) 双浮点数实际上是按指数缩放的整数。[0,10]中有多少不同的双浮点值?您可以在[0,1,2,…n]中生成一个整数,其中n是该数字,然后对其进行缩放以获得浮点值。作为一种附加褶皱,在不同范围内有不同粒度的浮子。我想你们得看看[2^m,2^(m+1)]形式的范围 (2)拒收方法。找出一种方法来生成大于[0,10]的某个范围内的数字,然后拒绝任何不在该范围内的数字 祝你好运,玩得开心
# 1 楼答案
编辑:我已经进一步研究过了
要获得下一个更高的可能的双倍值,请使用
Math.ulp(double)
10.0
的下一个较高值是10.000000000000002
在生成随机数的情况下:
https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#ulp(double)
我的旧理论是不正确的:
2e-1074
是double类型的最小正非零值。 这个常数是Double.MIN_VALUE
。因此10 + 2e-1074
与Math.random()
相乘,理论上会得到一个[0;10]范围内的随机数用于
Double.MIN_VALUE
:https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#MIN_VALUE的Java文档# 2 楼答案
非常有趣的问题。我可以想出两种方法来尝试。(1) 双浮点数实际上是按指数缩放的整数。[0,10]中有多少不同的双浮点值?您可以在[0,1,2,…n]中生成一个整数,其中n是该数字,然后对其进行缩放以获得浮点值。作为一种附加褶皱,在不同范围内有不同粒度的浮子。我想你们得看看[2^m,2^(m+1)]形式的范围
(2)拒收方法。找出一种方法来生成大于[0,10]的某个范围内的数字,然后拒绝任何不在该范围内的数字
祝你好运,玩得开心