如何获得全范围的随机浮点值?

How can I get full-ranged random float values?

我发现 Random#nextFloat returns 介于 0.01.0 之间的值。

如何获得随机浮点值,例如 -72.0F126.232F

我目前是这样做的。

float randomFloat() {
    final ThreadLocalRandom random = ThreadLocalRandom.current();
    float value = random.nextFloat() * Float.MAX_VALUE;
    if (random.nextBoolean()) {
        value = 0 - value;
    }
    return value;
}

这样对吗?还有其他方法吗?

我建议生成绑定双精度数然后转换为浮点数:

return Double.valueOf(random.nextDouble(Float.MIN_VALUE, Float.MAX_VALUE)).floatValue();

nextDouble 方法已在 Java 8 中替换为生成双打流的方法。因此,在 Java 8 中,您将使用以下等效项:

DoubleStream randomDoubles = new Random().doubles(Float.MIN_VALUE, Float.MAX_VALUE);
Double.valueOf(randomDoubles.findAny().getAsDouble()).floatValue();

这是基于 中的一般思想,但修复了一个小错误并展示了如何使用 JDK 1.8:

实际编写方法
import java.util.Iterator;
import java.util.concurrent.ThreadLocalRandom;

public class Test {
  public static void main(String[] args) {
    Test t = new Test();
    for (int i = 0; i < 100; i++) {
      System.out.println(t.randomFloat());
    }
  }

  final ThreadLocalRandom random = ThreadLocalRandom.current();
  Iterator<Double> randomDoubles = random.doubles(-Float.MAX_VALUE,
      Math.nextUp((double) Float.MAX_VALUE)).iterator();
  float randomFloat() {
    return randomDoubles.next().floatValue();
  }
}

题中的代码使用了ThreadLocalRandom,所以我也照做了。 Randomdoubles方法排除上限。为了获得所需的完整范围,请使用大于所有有限 float 值的最小双精度数作为限制。获得 iterator<Double> 似乎比使用 findAny 等更简单直接