Утворити випадковий подвійний у діапазоні


143

У мене є два парні, як наступний

double min = 100;
double max = 101;

і з випадковим генератором мені потрібно створити подвійне значення між діапазоном хв і макс.

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

але тут немає нічого, де ми могли б вказати діапазон.

Відповіді:


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().
ЖРД

Зауважте, що результати цього часто виключають багато подвійних значень у бажаному діапазоні, якщо цей діапазон перевищує 0,0-1,0. Якщо бажаний діапазон містить більшу кількість значень, ніж діапазон 0,0-1,0, значення для кожного з них не буде, і вони ніколи не будуть генеровані. (За принципом голубів!). Через це рішення Тунакі краще.
Лій

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

1
@ K_7: Скажімо, наприклад, що 10 000 різного подвійного значення між 0,0 і 1,0 (насправді їх, мабуть, більше). Але якщо діапазон між rangeMinі rangeMaxвеликий, то між ними може бути 10 000 000 різних подвійних значень. Результат (rangeMax - rangeMin) * r.nextDouble()буде вибирати лише між 10 000 з тих можливих 1000000000 значень. (Я відчуваю , що це не ідеальне пояснення, але , можливо , це допоможе трохи ...)
Лії

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

138

Це питання було задано перед випуском Java 7, але тепер є ще один можливий спосіб використання API Java 7 (і вище):

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

nextDoubleповерне псевдовипадкове подвійне значення між мінімальним (включно) і максимальним (виключним). Межі не обов'язково int, і можуть бути double.


6
для дзвінка потрібен api 21
Zar E Ahmer

2
@XarEAhmer Що таке API 21?
Абхіджіт Саркар

Схоже, він має на увазі 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.


EDIT 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 випадкові екземпляри, що використовують одне і те ж насіння, повернуть те саме значення в певних умовах.

Спочатку добре переглянути функцію doc, щоб зрозуміти її ( 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. додайте зміщення

Зрештою, ви можете бачити, що цей моб дав вам найпростіший і найпоширеніший спосіб зробити це, на мою думку

подвійний randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble ();

подвійний RandomValue = Зсув + (Діапазон) * (randomVal між 0,0-1,0)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.