我想在Java中生成一个随机的浮点数值。该值必须在可能值的特定范围内。
例如,我必须生成一个在以下范围内的随机值:
MIN: 41,815080
MAX: 41,829191
这些值恰好代表地图上可能经度的范围,但问题更普遍适用。
有什么聪明的方法呢?
我想在Java中生成一个随机的浮点数值。该值必须在可能值的特定范围内。
例如,我必须生成一个在以下范围内的随机值:
MIN: 41,815080
MAX: 41,829191
这些值恰好代表地图上可能经度的范围,但问题更普遍适用。
有什么聪明的方法呢?
对于在某个范围内的随机值,公式为:
double random = min + Math.random() * (max - min);
Math.random()
提供了相当分散的数字,但你可以用任何你想要的随机数生成器来替换它,例如(稍微好一些):Random r = new Random();
double random = min + r.nextDouble() * (max - min);
float
。float random = min + r.nextFloat() * (max - min);
为了获得更好的质量(以速度为代价)随机数生成,请使用
Random random = new SecureRandom();
或者您可以使用更加奇特的第三方库,例如:
import org.apache.commons.math3.random.RandomDataGenerator;
RandomData random = new RandomDataGenerator();
使用优秀的Well19937c算法。
max
和min
值,无论是正数还是负数。请注意,-1大于-2。 - Bohemianmax-min
是3 - -3
,即3 + 3
,即6
,常识告诉你这是从-3
到+3
的距离。因此,整个表达式就是-3 + r.nextFloat() * 6
。平均而言,产生的值有一半将是负数(介于-3和0之间)。 - Bohemianmax
很大,而min
很小或为零。r.nextDouble() * (Double.MAX_VALUE - 0.0)
只会提供在 1.0e307
到 1.0e308
范围内的随机数,没有更小的数。 - Luke Hutchison|min| + |max| > Double.MAX_VALUE
的情况,它都无法表现良好,随着总和越大,问题会越来越严重。我从未遇到过使用这种范围的情况,也无法想象出这样的情况,但如果编写此函数,您可以检查该范围是否超出此限制,或更简单地要求 min
为非负数,或者只是在 javadoc 中声明此边缘情况未被考虑到。 - Bohemian如果你想生成随机浮点数,请尝试以下方法:
import java.util.Random;
public static float randFloat(float min, float max) {
Random rand = new Random();
return rand.nextFloat() * (max - min) + min;
}
希望这有所帮助。float
类型,而不是 int
类型。 - user4668606ThreadLocalRandom
类。public static double generateRandomDouble(double min, double max) {
return ThreadLocalRandom.current().nextDouble(min, max);
}
Math.random
的问题在于它会导致竞争。换句话说,如果您的代码与使用Math.random
的任何其他代码同时运行,则您的随机数可能需要重新计算。
new Random()
的问题在于每次调用它时都会创建一个新的Random
实例,这是额外的工作并且更冗长。ThreadLocalRandom
类有一个非常方便的nextDouble
重载,允许您指定“原点”和“边界”,即最小值和最大值。double
的方法,这是双精度浮点值,在Java中通常用于浮点值。但是,如果您想指定一个float
原始类型,可以使用以下方法:public static float generateRandomFloat(float min, float max) {
if (min >= max)
throw new IllegalArgumentException("max must be greater than min");
float result = ThreadLocalRandom.current().nextFloat() * (max - min) + min;
if (result >= max) // correct for rounding
result = Float.intBitsToFloat(Float.floatToIntBits(max) - 1);
return result;
}
ThreadLocalRandom
上没有nextFloat
重载,可能是因为他们预计很少有人需要随机float
。要正确编写此方法,必须纠正浮点舍入问题。因此,强烈建议您使用生成double
的版本。Math.random
,除非需要特定的种子,也不应该每次需要生成随机数时创建新的Random
实例。在生成随机数时,请默认使用ThreadLocalRandom
类。代码:
import java.util.Scanner;
public class Hello
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
double max,min,randfloat;
System.out.println("Enter minimum :");
min=sc.nextDouble();
System.out.println("Enter maximum :");
max=sc.nextDouble();
randfloat=(Math.random())*(max-min)+min; //Math.random() generates random value between 0 and 1
System.out.println("Random float value generated is: "+randfloat);
sc.close();
}
}