Math.random () Erklärung

133

Dies ist eine ziemlich einfache Java-Frage (obwohl sie wahrscheinlich für alle Programmieraufgaben gilt):

Math.random() gibt eine Zahl zwischen null und eins zurück.

Wenn ich eine Ganzzahl zwischen null und hundert zurückgeben möchte, würde ich Folgendes tun:

(int) Math.floor(Math.random() * 101)

Zwischen ein und hundert würde ich tun:

(int) Math.ceil(Math.random() * 100)

Aber was ist, wenn ich eine Zahl zwischen drei und fünf haben möchte? Wird es wie folgt sein:

(int) Math.random() * 5 + 3

Ich weiß über nextInt()in java.lang.util.Random. Aber ich möchte lernen, wie man das macht Math.random().

switz
quelle
Für [3,5]:(int)Math.floor(Math.random()*3) + 3
good_evening
9
Übrigens: Der Bereich reicht von 0,0 einschließlich bis 1,0 exklusiv (Sie werden 1,0 nie wirklich bekommen). Die Verwendung von nextInt () ist eine weitaus bessere Wahl, nicht nur einfacher, sondern auch viel schneller.
Peter Lawrey
2
Die Verwendung Math.ceilist falsch und führt bei der Math.random()Rückgabe zu einem falschen Ergebnis 0.
Starblue
Was ist, wenn Math.floor 0,029 zurückgibt? Wie bekomme ich immer eine zweistellige Nummer mit einer einzigen Anweisung?
Naisheel Verdhan

Antworten:

165
int randomWithRange(int min, int max)
{
   int range = (max - min) + 1;     
   return (int)(Math.random() * range) + min;
}

randomWithRange(2, 5)10-fache Ausgabe :

5
2
3
3
2
4
4
4
5
4

Die Grenzen sind inklusive, dh [2,5], und minmüssen kleiner sein als maxim obigen Beispiel.

EDIT: Wenn jemand versuchen würde, dumm und umgekehrt zu sein minund max, könnten Sie den Code ändern in:

int randomWithRange(int min, int max)
{
   int range = Math.abs(max - min) + 1;     
   return (int)(Math.random() * range) + (min <= max ? min : max);
}

EDIT2: Für Ihre Frage zu doubles ist es nur:

double randomWithRange(double min, double max)
{
   double range = (max - min);     
   return (Math.random() * range) + min;
}

Und wieder, wenn Sie es idiotensicher machen wollen, ist es nur:

double randomWithRange(double min, double max)
{
   double range = Math.abs(max - min);     
   return (Math.random() * range) + (min <= max ? min : max);
}
AusCBloke
quelle
1
Was ist, wenn Sie nicht verwenden (int)und möchten, dass es ein doublezurückgibt?
Switz
Wenn Sie double möchten, ersetzen Sie einfach das ints durch doubles (und die Typumwandlung ist nicht erforderlich). Ich nahm an, du wolltest ints, aber ich werde meinen Beitrag ergänzen.
AusCBloke
2
Eigentlich mit doubles entfernen die + 1auch da Math.random()wird nicht abgeschnitten. Der Bereich ist jedoch [min, max), da Math.random"ein doppelter Wert mit einem positiven Vorzeichen zurückgegeben wird, der größer oder gleich 0,0 und kleiner als 1,0 ist." Es würde eine sehr geringe Wahrscheinlichkeit geben, dass die Zahl genau maxist, selbst wenn es möglich wäre.
AusCBloke
44

Wenn Sie eine Zahl von 0 bis 100 generieren möchten, sieht Ihr Code folgendermaßen aus:

(int)(Math.random() * 101);

So generieren Sie eine Zahl von 10 bis 20:

(int)(Math.random() * 11 + 10);

Im allgemeinen Fall:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound);

(wo lowerboundist inklusive und upperboundexklusiv).

Der Einschluss oder Ausschluss von upperboundhängt von Ihrer Wahl ab. Nehmen wir an, range = (upperbound - lowerbound) + 1dann upperboundist inklusive, aber wenn range = (upperbound - lowerbound)dann upperboundexklusiv.

Beispiel: Wenn ich eine Ganzzahl zwischen 3-5 möchte, dann ist, wenn der Bereich (5-3) +1 ist, 5 inklusive, aber wenn der Bereich nur (5-3) ist, ist 5 exklusiv.

Teezy7
quelle
2
upperboundexklusiv? Ich denke, es wird inklusive sein.
Video
1
@vidit es ist exklusiv
1
Ich glaube nicht, dass Sie das große Ganze erreichen können, wie im Beispiel angegeben
Teezy7
19

Die Randomim java.utilPaket enthaltene Java-Klasse erfüllt Ihren Zweck besser. Es gibt einige nextInt()Methoden, die eine Ganzzahl zurückgeben. Derjenige, der ein int-Argument verwendet, generiert eine Zahl zwischen 0 und diesem int, wobei letzteres nicht inklusive ist.

G_H
quelle
Ich habe meine Frage aktualisiert und möchte wissen, wie es geht Math.random(). Vielen Dank.
Switz
1

Um eine Zahl zwischen 10 und einschließlich 20 zu generieren, können Sie verwenden java.util.Random

int myNumber = new Random().nextInt(11) + 10
Ilya Gazman
quelle
0

Hier ist eine Methode, die Grenzen empfängt und eine zufällige Ganzzahl zurückgibt. Es ist etwas weiter fortgeschritten (völlig universell): Grenzen können sowohl positiv als auch negativ sein , und minimale / maximale Grenzen können in beliebiger Reihenfolge auftreten.

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

Im Allgemeinen wird der absolute Abstand zwischen den Rändern ermittelt, der relevante Zufallswert abgerufen und die Antwort basierend auf dem unteren Rand verschoben.

Fehlertoleranz
quelle