Java 在一个范围内生成一个随机双精度

Java 在一个范围内生成一个随机双精度,java,random,Java,Random,我有两个双打,如下所示 double min = 100; double max = 101; 使用随机生成器,我需要在最小值和最大值之间创建一个双值 Random r = new Random(); r.nextDouble(); 但是这里没有可以指定范围的内容。要在rangeMin和rangeMax之间生成一个随机值: Random r = new Random(); double randomValue = rangeMin + (rangeMax - rangeMin) * r.ne

我有两个双打,如下所示

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 start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);

编辑:

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
new Random().nextDouble()
:随机生成一个介于0和1之间的数字

开始
:开始编号,将编号“向右”移动

结束-开始
:间隔。Random会给你这个数字的0%到100%,因为Random会给你一个0到1的数字


编辑2:
Tks@daniel和@aaa bbb。我的第一个答案是错误的。

这个问题在Java 7发布之前就被问到了,但现在,有另一种可能的方式使用Java 7(及以上)API:

将返回介于最小值(包含)和最大值(排除)之间的伪随机双精度值。边界不一定是
int
,可以是
double

import java.util.Random;
公共类MyClass{
公共静态void main(字符串参数[]){
Double min=0.0;//设置为所需的最小值
Double max=10.0;//设置为所需的最大值
double x=(Math.random()*((max-min)+1))+min;//这将在最小值和最大值之间创建一个随机数。
double xrounded=Math.round(x*100.0)/100.0;//创建最接近第100位的答案,您可以修改此选项以更改其取整方式。
System.out.println(xrounded);//现在将打印出取整的随机数。
}
}
Random Random=new Random();
百分之二=10.0//10.0%
if(random.nextDouble()*100D
随机的主要思想是它返回一个伪随机值。 不存在完全随机函数,因此,在某些条件下,使用相同种子的两个随机实例将返回相同的值

首先查看功能文档以理解它是一种很好的做法 ()

现在我们知道函数nextDouble()的返回值是一个介于0.0和1.0之间的伪随机值,我们可以利用它

为了在a和B之间创建一个随机数,以确保边界有效(a>B),我们需要: 1.找出A和B之间的范围,这样我们就可以知道我们有多少“步骤”。 2.使用random函数确定要执行的步骤数(因为返回值介于0.0和1.0之间,所以可以将其视为“选择随机增加百分比” 3.添加偏移量

在所有这些之后,你可以看到暴徒给了你最简单和最常见的方法,在我看来

双随机值=rangeMin+(rangeMax-rangeMin)*r.nextDouble()


double RandomValue=偏移量+(范围)*(randomVal在0.0-1.0之间)

希望,这可能会有最好的帮助:


共享完整的程序: 以下是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
了解更多信息:

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

这通常是正确的,但要注意它的限制。如果您这样做
double rangeMax=double.MAX\u VALUE;
double rangeMin=-rangeMax;
您将始终得到一个无穷大的值作为回报。您可能需要检查
double.valueOf(rangeMax rangeMin).isInfinite()
。请注意,如果所需范围大于0.0-1.0,则此操作的结果通常会排除所需范围内的许多双精度值。如果所需范围包含的值数量大于范围0.0-1.0,则每个值都不会有值,并且永远不会生成这些值。(根据鸽子洞原理!)。因为这样更好。@Lii每个值都不会有一个值,为什么不呢?@K_7:例如,假设在0.0和1.0之间有10000个不同的双精度值(实际上可能有更多)。但是,如果
rangeMin
rangeMax
之间的范围较大,则它们之间可能存在10000000个不同的双精度值。
(rangeMax-rangeMin)*r.nextDouble()
的结果将仅在10000个可能的10000000个值中进行选择。(我觉得这不是一个完美的解释,但可能有一点帮助…)啊,我明白了。基本上,乘以一个可以接受有限值集的数字不会改变该集的大小。调用需要api21@XarEAhmer什么是API 21?看起来他指的是Android。我喜欢这样可以减少一个参数(相对于有一个最小值和最大值,只需有一个间隔)
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