Es gibt einige Beispiele auf der Mozilla Developer Network-Seite:
/**
* Returns a random number between min (inclusive) and max (exclusive)
*/
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
/**
* Returns a random integer between min (inclusive) and max (inclusive).
* The value is no lower than min (or the next integer greater than min
* if min isn't an integer) and no greater than max (or the next integer
* lower than max if max isn't an integer).
* Using Math.round() will give you a non-uniform distribution!
*/
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Hier ist die Logik dahinter. Es ist eine einfache Regel von dreien:
Math.random()
gibt eine Number
zwischen 0 (inklusive) und 1 (exklusive) zurück. Also haben wir ein Intervall wie dieses:
[0 .................................... 1)
Jetzt möchten wir eine Zahl zwischen min
(inklusive) und max
(exklusive):
[0 .................................... 1)
[min .................................. max)
Wir können das Math.random
verwenden, um den entsprechenden Wert im Intervall [min, max) zu erhalten. Aber zuerst sollten wir das Problem ein wenig vereinfachen, indem wir min
vom zweiten Intervall subtrahieren:
[0 .................................... 1)
[min - min ............................ max - min)
Dies ergibt:
[0 .................................... 1)
[0 .................................... max - min)
Jetzt können wir Math.random
anwenden und dann den entsprechenden Wert berechnen. Wählen wir eine zufällige Zahl:
Math.random()
|
[0 .................................... 1)
[0 .................................... max - min)
|
x (was wir brauchen)
Um also x
zu finden, würden wir folgendes tun:
x = Math.random() * (max - min);
Vergessen Sie nicht, min
wieder hinzu zu addieren, sodass wir eine Zahl im Intervall [min, max) erhalten:
x = Math.random() * (max - min) + min;
Das war die erste Funktion von MDN. Die zweite Funktion gibt eine Ganzzahl zwischen min
und max
, beide inklusive, zurück.
Für Ganzzahlen könnten Sie round
, ceil
oder floor
verwenden.
Sie könnten Math.round(Math.random() * (max - min)) + min
verwenden, dies führt jedoch zu einer ungleichmäßigen Verteilung. Sowohl min
als auch max
haben nur ungefähr die Hälfte der Chance zu würfeln:
min...min+0.5...min+1...min+1.5 ... max-0.5....max
... Math.round()
min min+1 max
Wenn max
aus dem Intervall ausgeschlossen ist, hat es eine noch geringere Chance zu würfeln als min
.
Mit Math.floor(Math.random() * (max - min +1)) + min
haben Sie eine perfekt gleichmäßige Verteilung.
min... min+1... ... max-1... max.... (max+1 is excluded from interval)
... Math.floor()
min min+1 max-1 max
Sie können ceil()
und -1
nicht in dieser Gleichung verwenden, weil max
jetzt eine leicht geringere Chance hat zu würfeln, aber Sie könnten auch das (unerwünschte) Ergebnis von min-1
würfeln.
2 Stimmen
Hier ist ein nützlicher Gist: gist.github.com/kerimdzhanov/7529623
15 Stimmen
Als kleine Anmerkung: Für diejenigen, die npm verwenden und nach einer schnellen, zuverlässigen und fertigen Lösung suchen, gibt es lodash.random, das mit einem super kleinen Footprint einfach erforderlich ist (es importiert nur die Methode selbst und nicht das gesamte lodash).
0 Stimmen
Wenn es krypto-sicher sein muss developer.mozilla.org/en-US/docs/Web/API/RandomSource/…
0 Stimmen
Kannst du bei der Frage zum Zahlenbereich explizit sein? Insbesondere Null. Was ist mit negativen Zahlen? (_"Texte, die Null aus den natürlichen Zahlen ausschließen, bezeichnen manchmal die_ natürlichen Zahlen zusammen mit Null als die ganzen Zahlen"). (Aber ohne "Edit:", "Update:" oder ähnliches - die Frage sollte so erscheinen, als wäre sie heute geschrieben worden.)
2 Stimmen
Viele Antworten hier beantworten eine andere Frage (sie sind keine echten Antworten). Es ist so, als ob einige Benutzer nur "Zufällige ganze Zahlen generieren" lesen und nie zum "in einem bestimmten Bereich" Teil (oder sogar zum Teil mit dem [4; 8] Beispiel) kommen.
0 Stimmen
Das entsprechende für Java (102 Antworten, inkl. gelöschte): Wie generiere ich zufällige Ganzzahlen innerhalb eines bestimmten Bereichs in Java?