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.