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

时间:2015-06-02 03:51:31

标签: java random floating-point

我发现Random#nextFloat返回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;
}

这是对的吗?还有其他办法吗?

2 个答案:

答案 0 :(得分:2)

我建议生成一个绑定的double,然后转换为float:

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

在Java 8中,nextDouble方法已被替换为生成双精度流的方法。因此,在Java 8中,您将使用以下等价物:

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

答案 1 :(得分:2)

这是基于prior answer中的一般概念,但修复了一个小错误,并展示了如何使用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,所以我做了同样的事情。 Random doubles方法排除了上限。为了获得所需的全范围,请使用大于所有有限float值的最小双精度作为限制。获得iterator<Double>似乎比使用findAny等更简单,更直接。