可以浮点不准确导致Math.random()或new Random()。nextFloat()实际返回值< 0或> = 1?

时间:2015-10-05 01:51:43

标签: java random floating-point floating-accuracy

一方面,Math.random()或新的Random()。nextFloat()应返回介于0和1之间的值,但不包括1,另一方面浮点数可能不准确,该值可能会在实际值附近变化值。这是否意味着Math.random()或新的Random()。nextFloat()可能在实际中返回值<0或&gt; = 1?如果没有,为什么不会发生这种情况?

2 个答案:

答案 0 :(得分:5)

没有。文档特别保证了可能的输出范围,并指定了实现必须等同于的算法:

public float nextFloat() {
  return next(24) / ((float)(1 << 24));
}

保证在半开区间[0.0,1.0]产生结果。

虽然浮点运算本身必须围绕其结果,但/或转换为浮点等基本操作具有特定的标准化舍入行为。在这种情况下,所涉及的每个浮点运算的结果都是完全可表示的,因此不会产生舍入误差。

答案 1 :(得分:-1)

根据IEEE754的工作原理,您是安全的,因为如果您想编码1.0,您将拥有:

exponent    -  mantissa
011111111   -  00000...00

随机化尾数和指数的最后7位(并且不会让它们同时为1),你将始终有一个介于0和1之间的数字。

您也不会有负数,因为您必须明确设置符号位以使其为负数。