Generieren Sie ein zufälliges Double in einem Bereich

143

Ich habe zwei Doppel wie das folgende

double min = 100;
double max = 101;

und mit einem Zufallsgenerator muss ich einen doppelten Wert zwischen dem Bereich von min und max erstellen.

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

Hier gibt es jedoch nichts, wo wir den Bereich angeben können.

Swati
quelle

Antworten:

237

So generieren Sie einen zufälligen Wert zwischen rangeMinund rangeMax:

Random r = new Random();
double randomValue = rangeMin + (rangeMax - rangeMin) * r.nextDouble();
Mob
quelle
21
Dies ist im Allgemeinen richtig, aber achten Sie auf seine Grenzen. Wenn Sie das tun double rangeMax= Double.MAX_VALUE;und double rangeMin= -rangeMax;Sie werden immer einen unendlichen Wert im Gegenzug bekommen. Vielleicht möchten Sie nach suchen Double.valueOf(rangeMax-rangeMin).isInfinite().
lre
Beachten Sie, dass die Ergebnisse häufig viele Doppelwerte im gewünschten Bereich ausschließen, wenn dieser Bereich größer als 0,0-1,0 ist. Wenn der gewünschte Bereich eine größere Anzahl von Werten als der Bereich von 0,0 bis 1,0 enthält, gibt es nicht für jeden einen Wert, und sie werden niemals generiert. (Nach dem Pigeonhole-Prinzip!). Aus diesem Grund ist Tunakis Lösung besser.
Lii
@Lii es wird nicht für jeden einen Wert geben, warum nicht?
Kartik Chugh
1
@ K_7: Sagen Sie zum Beispiel, dass es 10.000 unterschiedliche Doppelwerte zwischen 0,0 und 1,0 gibt (in Wirklichkeit gibt es wahrscheinlich mehr). Wenn der Bereich zwischen rangeMinund rangeMaxjedoch groß ist, können zwischen ihnen 10.000.000 unterschiedliche Doppelwerte liegen. Das Ergebnis von (rangeMax - rangeMin) * r.nextDouble()wird nur zwischen 10.000 dieser möglichen 10.000.000 Werte wählen. (Ich denke, dass dies keine perfekte Erklärung ist, aber vielleicht hilft es ein bisschen ...)
Lii
1
Ah ich sehe. Grundsätzlich ändert das Multiplizieren einer Zahl, die einen endlichen Satz von Werten annehmen kann, die Größe dieses Satzes nicht.
Kartik Chugh
138

Diese Frage wurde vor der Veröffentlichung von Java 7 gestellt, aber jetzt gibt es eine andere Möglichkeit, die Java 7-API (und höher) zu verwenden:

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

nextDoublegibt einen pseudozufälligen Doppelwert zwischen dem Minimum (einschließlich) und dem Maximum (exklusiv) zurück. Die Grenzen sind nicht unbedingt intund können es auch sein double.

Tunaki
quelle
6
Anruf erfordert API 21
Zar E Ahmer
2
@XarEAhmer Was ist API 21?
Abhijit Sarkar
Sieht so aus, als würde er sich auf Android beziehen.
Kartik Chugh
40

Benutze das:

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

BEARBEITEN:

new Random().nextDouble(): generiert zufällig eine Zahl zwischen 0 und 1.

start: Startnummer, um die Nummer "nach rechts" zu verschieben

end - start: Intervall. Zufällig gibt Ihnen 0% bis 100% dieser Zahl, weil Zufall eine Zahl von 0 bis 1 ergibt.


EDIT 2: Tks @daniel und @aaa bbb. Meine erste Antwort war falsch.

Topera
quelle
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.
     }
}
Larson Carter
quelle
0
Random random = new Random();
double percent = 10.0; //10.0%
if (random.nextDouble() * 100D < percent) {
    //do
}
Tau
quelle
0

Die Hauptidee von Zufall ist, dass es einen Pseudozufallswert zurückgibt. Es gibt keine vollständig zufälligen Funktionen, daher geben 2 zufällige Instanzen, die denselben Startwert verwenden, unter bestimmten Bedingungen denselben Wert zurück.

Es wird empfohlen, zuerst das Funktionsdokument anzuzeigen, um es zu verstehen ( https://docs.oracle.com/javase/8/docs/api/java/util/Random.html) ).

Nachdem wir nun verstanden haben, dass der zurückgegebene Wert der Funktion nextDouble () ein Pseudozufallswert zwischen 0,0 und 1,0 ist, können wir ihn zu unserem Vorteil verwenden.

Um eine Zufallszahl zwischen A und B zu erstellen, die angibt, dass die Grenzen gültig sind (A> B), müssen wir: 1. den Bereich zwischen A und B ermitteln, damit wir wissen, wie viele "Schritte" wir haben. 2. Verwenden Sie die Zufallsfunktion, um zu bestimmen, wie viele Schritte ausgeführt werden sollen (da der zurückgegebene Wert zwischen 0,0 und 1,0 liegt, können Sie ihn als "zufälligen Prozentsatz der Erhöhung auswählen" betrachten. 3. Fügen Sie den Versatz hinzu

Nach all dem können Sie sehen, dass Mob Ihnen meiner Meinung nach den einfachsten und gebräuchlichsten Weg dazu gegeben hat

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

double RandomValue = Offset + (Range) * (randomVal zwischen 0.0-1.0)

Yair Landmann
quelle