生成范围内的随机双精度


143

我有两个如下的双打

double min = 100;
double max = 101;

并使用随机生成器,我需要在min和max范围之间创建一个双精度值。

Random r = new Random();
r.nextDouble();

但是这里没有什么可以指定范围的。

Answers:


237

要在rangeMin和之间生成一个随机值rangeMax

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();

21
这通常是正确的,但要注意其局限性。如果这样做double rangeMax= Double.MAX_VALUE;double rangeMin= -rangeMax;您将始终获得无限值作为回报。您可能需要检查Double.valueOf(rangeMax-rangeMin).isInfinite()
lre 2014年

请注意,如果该范围大于0.0-1.0,则此结果通常会排除期望范围内的许多double值。如果所需范围包含的值数量大于范围0.0-1.0,则每个值都将没有值,并且永远不会生成它们。(根据信鸽原则!)。因此,Tunaki的解决方案更好。

@Lii 每个人都没有价值,为什么不呢?
卡蒂克·楚

1
@ K_7:例如,假设在0.0和1.0之间有10,000个不同的double值(实际上可能还有更多)。但是,如果之间的范围rangeMinrangeMax较大,则有可能是他们之间的不同10,000,000双重价值。的结果(rangeMax - rangeMin) * r.nextDouble()将仅在可能的10,000,000个值中的10,000个之间进行选择。(我觉得这不是一个完美的解释,但也许会有所帮助...)
Lii

1
啊,我明白了。基本上,将一个可以采用一组有限值的数字相乘不会改变该组的大小。
卡蒂克·楚

138

在Java 7发行之前曾问过这个问题,但是现在,使用Java 7(及更高版本)API还有另一种可能的方式:

double random = ThreadLocalRandom.current().nextDouble(min, max);

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


6
电话需要api 21
Zar E Ahmer '17

2
@XarEAhmer什么是API 21?
Abhijit Sarkar,

看起来他指的是Android。
Kartik Chugh,

40

用这个:

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: Tks @daniel和@aaa bbb。我的第一个答案是错误的。


4
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.
     }
}

0
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
    //do
}

0

随机的主要思想是它返回一个伪随机值。没有完全随机的函数,因此,在某些情况下,使用相同种子的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.使用随机函数确定要执行的步骤(由于返回值介于0.0和1.0之间,因此您可以将其视为“选择随机增加的百分比”)3.添加偏移量

毕竟,我认为暴民为您提供了最简单,最常见的方式

double randomValue = rangeMin +(rangeMax-rangeMin)* r.nextDouble();

double RandomValue =偏移量+(Range)*(0.0到1.0之间的randomVal)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.