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
让您完全受平台实现的支配。在某些平台上,您可能会发现这不是一个可移植的解决方案。我给的是保证书