Java 如何获取全范围随机浮点值?
我发现它返回的值介于Java 如何获取全范围随机浮点值?,java,random,floating-point,Java,Random,Floating Point,我发现它返回的值介于0.0和1.0之间 如何获得随机浮点值,如-72.0F或126.232F 我现在就是这样做的 float随机化float(){ final ThreadLocalRandom=ThreadLocalRandom.current(); float value=random.nextFloat()*float.MAX_value; if(random.nextBoolean()){ 值=0-值; } 返回值; } 是这样吗?还有其他方法吗?我建议生成一个绑定双精度,然后转换为浮
0.0
和1.0
之间
如何获得随机浮点值,如-72.0F
或126.232F
我现在就是这样做的
float随机化float(){
final ThreadLocalRandom=ThreadLocalRandom.current();
float value=random.nextFloat()*float.MAX_value;
if(random.nextBoolean()){
值=0-值;
}
返回值;
}
是这样吗?还有其他方法吗?我建议生成一个绑定双精度,然后转换为浮点:
return Double.valueOf(random.nextDouble(Float.MIN_VALUE, Float.MAX_VALUE)).floatValue();
在Java8中,nextDouble
方法已被一种生成双精度流的方法所取代。因此,在Java 8中,您将使用以下等效项:
DoubleStream randomDoubles = new Random().doubles(Float.MIN_VALUE, Float.MAX_VALUE);
Double.valueOf(randomDoubles.findAny().getAsDouble()).floatValue();
我建议生成一个绑定双精度,然后转换为float:
return Double.valueOf(random.nextDouble(Float.MIN_VALUE, Float.MAX_VALUE)).floatValue();
在Java8中,nextDouble
方法已被一种生成双精度流的方法所取代。因此,在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();
}
}
import java.util.Iterator;
导入java.util.concurrent.ThreadLocalRandom;
公开课考试{
公共静态void main(字符串[]args){
测试t=新测试();
对于(int i=0;i<100;i++){
System.out.println(t.randomFloat());
}
}
final ThreadLocalRandom=ThreadLocalRandom.current();
迭代器randomDoubles=随机。双精度(-Float.MAX_值,
Math.nextUp((double)Float.MAX_VALUE)).iterator();
浮点随机浮点(){
返回randomDoubles.next().floatValue();
}
}
问题中的代码使用了ThreadLocalRandom,所以我也这么做了。随机
双倍方法排除上限。为了获得所需的全量程,使用大于所有有限浮点值的最小双精度作为限值。获取迭代器
似乎比使用findAny
等更简单、更直接。这是基于中的一般思想,但修复了一个小错误,并展示了如何使用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();
}
}
import java.util.Iterator;
导入java.util.concurrent.ThreadLocalRandom;
公开课考试{
公共静态void main(字符串[]args){
测试t=新测试();
对于(int i=0;i<100;i++){
System.out.println(t.randomFloat());
}
}
final ThreadLocalRandom=ThreadLocalRandom.current();
迭代器randomDoubles=随机。双精度(-Float.MAX_值,
Math.nextUp((double)Float.MAX_VALUE)).iterator();
浮点随机浮点(){
返回randomDoubles.next().floatValue();
}
}
问题中的代码使用了ThreadLocalRandom,所以我也这么做了。随机双倍方法排除上限。为了获得所需的全量程,使用大于所有有限浮点值的最小双精度作为限值。获取一个迭代器
似乎比使用findAny
等更简单、更直接。我想你可以调用random.nextInt()
,然后使用Float.intBitsToFloat()
。不过,这可能不像您希望的那样随机,您可能必须处理位模式中的格式错误。我认为您可以调用random.nextInt()
,然后使用Float.intBitsToFloat()
。不过,这可能不像您希望的那样随机,您可能必须处理位模式中的格式错误。这不会产生任何负数。另外,如果random
是java.util.random,它在JDK 1.8中没有该方法。@PatriciaShanahan我已经测试过了,它很高兴地产生了负数-我不确定你从哪里得到了它不产生负数的观点。Java8中有一个等价的方法:doubles
,它生成一个double流。我将在答案中添加Java 8版本。问题是Random.doubles()或Random.nextDouble()使用统一选择的介于0和1之间的双精度值,然后缩放它们以适应边界。这意味着某些值将丢失,某些值将比其他值更频繁地出现(尽管总而言之,直方图可能不会显示这一点)@markspace的想法是正确的。@llogiq给定双精度,然后将其缩小为浮点值,无论如何,不会有任何缺失或重复的值。使用intBitsToFloat
让您完全受平台实现的支配。在某些平台上,您可能会发现这不是一个可移植的解决方案。我给的是语言规范保证的。你能发布你的测试程序吗?我得到编译错误是因为findAny
调用的结果,即optionaldough
,没有方法get
。我不希望出现负面结果的原因是它是正面的。这不会产生任何负面数字。另外,如果random
是java.util.random,它在JDK 1.8中没有该方法。@PatriciaShanahan我已经测试过了,它很高兴地产生了负数-我不确定你从哪里得到了它不产生负数的观点。Java8中有一个等价的方法:doubles
,它生成一个double流。我将在答案中添加Java 8版本。问题是Random.doubles()或Random.nextDouble()使用统一选择的介于0和1之间的双精度值,然后缩放它们以适应边界。这意味着某些值将丢失,某些值将比其他值更频繁地出现(尽管总而言之,直方图可能不会显示这一点)@markspace的想法是正确的。@llogiq给定双精度,然后将其缩小为浮点值,无论如何,不会有任何缺失或重复的值。使用intBitsToFloat
让您完全受平台实现的支配。在某些平台上,您可能会发现这不是一个可移植的解决方案。我给的是保证书