【发布时间】:2010-09-09 21:15:40
【问题描述】:
我有两个像下面这样的双打
double min = 100;
double max = 101;
使用随机生成器,我需要在最小值和最大值之间创建一个双精度值。
Random r = new Random();
r.nextDouble();
但是这里没有我们可以指定范围的地方。
【问题讨论】:
我有两个像下面这样的双打
double min = 100;
double max = 101;
使用随机生成器,我需要在最小值和最大值之间创建一个双精度值。
Random r = new Random();
r.nextDouble();
但是这里没有我们可以指定范围的地方。
【问题讨论】:
在rangeMin 和rangeMax 之间生成一个随机值:
Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();
【讨论】:
double rangeMax= Double.MAX_VALUE; 和double rangeMin= -rangeMax;,您将始终获得无限的回报。您可能需要检查Double.valueOf(rangeMax-rangeMin).isInfinite()。
rangeMin 和rangeMax 之间的范围很大,那么它们之间可能有10,000,000 个不同的双精度值。 (rangeMax - rangeMin) * r.nextDouble() 的结果只会在可能的 10,000,000 个值中选择 10,000 个。 (我觉得这不是一个完美的解释,但也许它有点帮助......)
这个问题是在 Java 7 发布之前提出的,但现在,使用 Java 7(及更高版本)API 有另一种可能的方式:
double random = ThreadLocalRandom.current().nextDouble(min, max);
nextDouble 将返回一个介于最小值(包括)和最大值(不包括)之间的伪随机双精度值。边界不一定是int,可以是double。
【讨论】:
使用这个:
double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);
编辑:
new Random().nextDouble():随机生成一个介于 0 和 1 之间的数字。
start:起始编号,将编号“向右”移动
end - start:间隔。随机给你这个数字的 0% 到 100%,因为随机给你一个从 0 到 1 的数字。
编辑 2: 谢谢@daniel 和@aaa bbb。我的第一个答案是错误的。
【讨论】:
import java.util.Random;
public class MyClass {
public static void main(String args[]) {
Double min = 0.0; // Set To Your Desired Min Value
Double max = 10.0; // Set To Your Desired Max Value
double x = (Math.random() * ((max - min) + 1)) + min; // This Will Create A Random Number Inbetween Your Min And Max.
double xrounded = Math.round(x * 100.0) / 100.0; // Creates Answer To The Nearest 100 th, You Can Modify This To Change How It Rounds.
System.out.println(xrounded); // This Will Now Print Out The Rounded, Random Number.
}
}
【讨论】:
希望,这可能会有所帮助:Random Number Generators in Java
import java.util.Random;
public class SecondSplitExample
{
public static void main(String []arguments)
{
int minValue = 20, maxValue=20000;
Random theRandom = new Random();
double theRandomValue = 0.0;
// Checking for a valid range-
if( Double.valueOf(maxValue - minValue).isInfinite() == false )
theRandomValue = minValue + (maxValue - minValue) * theRandom.nextDouble();
System.out.println("Double Random Number between ("+ minValue +","+ maxValue +") = "+ theRandomValue);
}
}
这是 3 次运行的输出:
Code>java SecondSplitExample
Double Random Number between (20,20000) = 2808.2426532469476
Code>java SecondSplitExample
Double Random Number between (20,20000) = 1929.557668284786
Code>java SecondSplitExample
Double Random Number between (20,20000) = 13254.575289900251
了解详情:
【讨论】:
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
//do
}
【讨论】:
random 的主要思想是它返回一个伪随机值。 没有完全随机函数这样的东西,因此,使用相同种子的 2 个随机实例将在某些条件下返回相同的值。
最好先查看函数文档以便理解它 (https://docs.oracle.com/javase/8/docs/api/java/util/Random.html)
现在我们知道函数 nextDouble() 的返回值是一个介于 0.0 和 1.0 之间的伪随机值,我们可以利用它来发挥我们的优势。
为了在 A 和 B 之间创建一个随机数,让边界有效 (A>B),我们需要: 1.找到A和B之间的范围,这样我们就可以知道我们有多少“步骤”。 2.使用random函数判断要走多少步(因为返回值在0.0到1.0之间你可以认为是“选择一个随机的增加百分比” 3.添加偏移量
在我看来,你可以看到 mob 给了你最简单和最常用的方法
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();
double RandomValue = Offset + (Range)*(randomVal between 0.0-1.0)
【讨论】: