Генерация случайного двойника в диапазоне


148

У меня есть два дублера, как показано ниже

double min = 100;
double max = 101;

и со случайным генератором мне нужно создать двойное значение между диапазоном min и max.

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

но здесь нет ничего, где мы могли бы указать диапазон.

Ответы:


243

Чтобы сгенерировать случайное значение между 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 07

Обратите внимание, что результаты этого часто исключают много двойных значений в желаемом диапазоне, если этот диапазон больше 0,0–1,0. Если желаемый диапазон содержит большее количество значений, чем диапазон 0,0–1,0, для каждого из них не будет значения, и они никогда не будут сгенерированы. (По принципу ячейки!). Из-за этого решение Тунаки лучше.
Lii

@Lii, почему бы и нет для каждого из них значения ?
Kartik Chugh

1
@ K_7: Скажем, например, что существует 10 000 различных значений типа double между 0,0 и 1,0 (на самом деле их, вероятно, больше). Но если диапазон между rangeMinи rangeMaxвелик, то между ними может быть 10 000 000 различных значений типа double. В результате (rangeMax - rangeMin) * r.nextDouble()будет выбрано только 10 000 из возможных 10 000 000 значений. (Я чувствую , что это не идеальное объяснение, но , возможно , это поможет немного ...)
Лии

1
Ах я вижу. По сути, умножение числа, которое может принимать конечный набор значений, не меняет размер этого набора.
Kartik Chugh

140

Этот вопрос задавали до выпуска Java 7, но теперь есть другой возможный способ использования API Java 7 (и выше):

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

nextDoubleвернет псевдослучайное двойное значение между минимальным (включительно) и максимальным (исключительным). Границы не обязательно intи могут быть double.


7
для вызова требуется api 21
AndroidGeek

2
@XarEAhmer Что такое API 21?
Abhijit Sarkar

Похоже, он имеет в виду Android.
Kartik Chugh

42

Использовать это:

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: интервал. Random дает вам от 0% до 100% этого числа, потому что random дает вам число от 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.
     }
}

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

Мне нравится, как это может уменьшить параметр (вместо минимального и максимального, просто есть интервал)
vphilipnyc

0

Основная идея random заключается в том, что он возвращает псевдослучайное значение. Полностью случайных функций не существует, поэтому 2 экземпляра Random, использующие одно и то же начальное число, в определенных условиях вернут одно и то же значение.

Рекомендуется сначала просмотреть документ функции, чтобы понять его ( 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 = Offset + (Диапазон) * (randomVal между 0,0–1,0)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.