Wygeneruj losowe podwójne w zakresie


143

Mam dwa podwójne, jak poniżej

double min = 100;
double max = 101;

a za pomocą generatora losowego muszę utworzyć podwójną wartość między zakresem min i max.

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

ale nie ma tu nic, gdzie moglibyśmy określić zakres.

Odpowiedzi:


237

Aby wygenerować losową wartość między rangeMina rangeMax:

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

21
Jest to ogólnie poprawne, ale uważaj na jego ograniczenia. Jeśli to zrobisz double rangeMax= Double.MAX_VALUE;i double rangeMin= -rangeMax;będziesz zawsze nieskończoną wartość w zamian. Możesz chcieć sprawdzić Double.valueOf(rangeMax-rangeMin).isInfinite().
— lre

Zauważ, że wyniki tego często wykluczają wiele podwójnych wartości w pożądanym zakresie, jeśli ten zakres jest większy niż 0,0-1,0. Jeśli żądany zakres zawiera większą liczbę wartości niż zakres 0,0-1,0, nie będzie wartości dla każdej z nich i nigdy nie zostaną one wygenerowane. (Zgodnie z zasadą szufladki!). Z tego powodu rozwiązanie Tunaki jest lepsze.
— Lii

@Lii nie będzie wartości dla każdego z nich, czemu nie?
— Kartik Chugh

1
@ K_7: Powiedzmy na przykład, że istnieje 10 000 różnych podwójnych wartości między 0,0 a 1,0 (w rzeczywistości jest ich prawdopodobnie więcej). Ale jeśli zakres między rangeMini rangeMaxjest duży, może między nimi znajdować się 10 000 000 odrębnych podwójnych wartości. Wynik (rangeMax - rangeMin) * r.nextDouble()wybierze tylko pomiędzy 10 000 z tych 10 000 000 możliwych wartości. (Czuję, że to nie jest idealne wyjaśnienie, ale może trochę pomaga ...)
— Lii,

1
O, rozumiem. Zasadniczo mnożenie liczby, która może przyjąć skończony zbiór wartości, nie zmienia rozmiaru tego zbioru.
— Kartik Chugh

138

To pytanie zostało zadane przed wydaniem Java 7, ale teraz istnieje inny możliwy sposób wykorzystania API Java 7 (i nowszych):

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

nextDoublezwróci pseudolosową wartość double między minimum (włącznie) a maksimum (wyłączność). Granice niekoniecznie są inti mogą być double.


6
połączenie wymaga api 21
— Zar E Ahmer

2
@XarEAhmer Jakie jest API 21?
— Abhijit Sarkar

Wygląda na to, że ma na myśli Androida.
— Kartik Chugh,

40

Użyj tego:

double start = 400;
double end = 402;
double random = new Random().nextDouble();
double result = start + (random * (end - start));
System.out.println(result);

EDYTOWAĆ:

new Random().nextDouble(): losowo generuje liczbę od 0 do 1.

start: numer początkowy, aby przesunąć numer „w prawo”

end - start: interwał. Random daje od 0% do 100% tej liczby, ponieważ random daje liczbę od 0 do 1.


EDYCJA 2: Tks @daniel i @aaa bbb. Moja pierwsza odpowiedź była błędna.


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

Główną ideą losowości jest to, że zwraca wartość pseudolosową. Nie ma czegoś takiego jak w pełni losowe funkcje, dlatego 2 losowe instancje używające tego samego ziarna zwrócą tę samą wartość w określonych warunkach.

Dobrą praktyką jest najpierw przejrzenie dokumentu funkcji, aby go zrozumieć ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html )

Teraz, gdy rozumiemy, że zwrócona wartość funkcji nextDouble () jest wartością pseudolosową z przedziału od 0,0 do 1,0, możemy to wykorzystać na naszą korzyść.

Aby utworzyć liczbę losową między A i B, aby stwierdzić, że granice są prawidłowe (A> B), musimy: 1. znaleźć zakres między A i B, abyśmy mogli wiedzieć, ile mamy „kroków”. 2. użyj funkcji losowej, aby określić, ile kroków należy wykonać (ponieważ zwrócona wartość zawiera się między 0,0 a 1,0, możesz o tym myśleć jako o „wybierz losowy procent wzrostu” 3. dodaj przesunięcie

Po tym wszystkim możesz zobaczyć, że mafia dał ci najłatwiejszy i najpopularniejszy sposób, moim zdaniem

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

double RandomValue = Offset + (Range) * (randomVal pomiędzy 0,0-1,0)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.