我发现Random#nextFloat返回0.0
和1.0
之间的值。
如何获得随机浮动值,例如-72.0F
或126.232F
?
我目前正在这样做。
float randomFloat() {
final ThreadLocalRandom random = ThreadLocalRandom.current();
float value = random.nextFloat() * Float.MAX_VALUE;
if (random.nextBoolean()) {
value = 0 - value;
}
return value;
}
这是对的吗?还有其他办法吗?
答案 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
等更简单,更直接。