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


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.