Odpowiedzi:
Aby wygenerować losową wartość między rangeMin
a rangeMax
:
Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();
rangeMin
i rangeMax
jest 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 ...)
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);
nextDouble
zwróci pseudolosową wartość double między minimum (włącznie) a maksimum (wyłączność). Granice niekoniecznie są int
i mogą być double
.
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.
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.
}
}
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)
double rangeMax= Double.MAX_VALUE;
idouble rangeMin= -rangeMax;
będziesz zawsze nieskończoną wartość w zamian. Możesz chcieć sprawdzićDouble.valueOf(rangeMax-rangeMin).isInfinite()
.