如何获得全范围的随机浮点值?
How can I get full-ranged random float values?
我发现 Random#nextFloat returns 介于 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;
}
这样对吗?还有其他方法吗?
我建议生成绑定双精度数然后转换为浮点数:
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
等更简单直接
我发现 Random#nextFloat returns 介于 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;
}
这样对吗?还有其他方法吗?
我建议生成绑定双精度数然后转换为浮点数:
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();
这是基于
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
等更简单直接