Gibt es eine Möglichkeit, eine Zufallszahl in einem bestimmten Bereich (z. B. von 1 bis 6: 1, 2, 3, 4, 5 oder 6) in JavaScript zu generieren?
javascript
random
Mirgorod
quelle
quelle
Math.floor((Math.random()*10)+1);
funktioniert eine solche Lösung nicht für Sie, wie hier unter w3schools.com/jsref/jsref_random.asp angegeben ?Antworten:
Wichtig
Der folgende Code funktioniert nur, wenn der Mindestwert ist
1
. Es funktioniert nicht für andere Mindestwerte als1
.Wenn Sie eine zufällige Ganzzahl zwischen 1 ( und nur 1 ) und 6 erhalten möchten, würden Sie Folgendes berechnen:
Wo:
quelle
Math.floor(Math.random() * 6) + 2
bedeutet dies, dass bei einemMath.random()
Ergebnis von 0,99 unser Zufallswert7
Was es "extra" macht, ist, dass es zufällige Intervalle zulässt, die nicht mit 1 beginnen. So können Sie beispielsweise eine Zufallszahl von 10 bis 15 erhalten. Flexibilität.
quelle
to
Argument nicht enthält ,from
verdoppelt sich das Argument als das MaximumReturns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.
( developer.mozilla.org/en-US/docs/JavaScript/Reference/… )Math.random ()
Gibt eine ganzzahlige Zufallszahl zwischen min ( enthalten ) und max ( enthalten ) zurück:
Oder eine beliebige Zufallszahl zwischen min ( enthalten ) und max ( nicht enthalten ):
Nützliche Beispiele (ganze Zahlen):
** Und immer schön daran erinnert zu werden (Mozilla):
quelle
[1,2]
, gibt es 25% ige Chance ,Math.random()
Sie würde eine Zahl von einer von diesen[0,0.49]
,[0.5,0.99]
,[1,1.49]
,[1.5,1.99]
. Das Runden dieser Intervalle würde zu 0, 1, 1, 2 führen, was keine gleichmäßige Verteilung ist. Bodenbelag sie ergibt 0, 0, 1, 1.Math.round
overMath.floor
zu unterschiedlichen Ergebnissen führen würde.function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Andere Lösungen:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
Versuchen Sie es online
quelle
~~a
und Bitwise OR (a | 0) sind schnellere Möglichkeiten, Math.floor (a) zu schreibena | 0
ist auch die schnellste und am besten optimierte Methode, um eine Zeichenfolge in eine Ganzzahl umzuwandeln. Es funktioniert nur mit Zeichenfolgen, die Ganzzahlen ("444"
und"-444"
) enthalten, dh keine Gleitkommazahlen / Brüche. Es ergibt ein0
für alles, was fehlschlägt. Dies ist eine der Hauptoptimierungen hinter asm.js.~~(Math.random() * (50000000000000 - 0 + 1)) + 0
undMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
Um die Zufallszahl zu erhalten
generateRandomInteger(-20, 20);
ERKLÄRUNG UNTEN
Wir müssen eine zufällige ganze Zahl erhalten, sagen wir X zwischen min und max.
Recht?
dh min <= X <= max
Wenn wir min von der Gleichung subtrahieren, ist dies äquivalent zu
0 <= (X - min) <= (max - min)
Multiplizieren wir dies nun mit einer Zufallszahl r, die ist
0 <= (X - min) * r <= (max - min) * r
Fügen wir nun min wieder zur Gleichung hinzu
min <= min + (X - min) * r <= min + (max - min) * r
Wählen wir nun eine Funktion, die zu r führt, so dass sie unseren Gleichungsbereich als [min, max] erfüllt. Dies ist nur möglich, wenn 0 <= r <= 1
OK. Der Bereich von r ie [0,1] ist dem Ergebnis der Math.random () -Funktion sehr ähnlich. Ist es nicht?
Zum Beispiel,
Fall r = 0
min
+ 0 * (max
-min
) = minFall r = 1
min
+ 1 * (max
-min
) = maxZufälliger Fall mit Math.random 0 <= r <1
min
+ r * (max
-min
) = X , wobei X einen Bereich von min <= X < max hatDas obige Ergebnis X ist eine Zufallszahl. Aufgrund von Math.random () ist unsere linke Grenze jedoch inklusive und die rechte Grenze ist exklusiv. Um unsere rechte Grenze einzuschließen, erhöhen wir die rechte Grenze um 1 und begründen das Ergebnis.
Um die Zufallszahl zu erhalten
generateRandomInteger(-20, 20)
;;quelle
Oder in Unterstrich
quelle
quelle
jsfiddle: https://jsfiddle.net/cyGwf/477/
Random Integer : Um eine zufällige Ganzzahl zwischen
min
und zu erhaltenmax
, verwenden Sie den folgenden CodeZufällige Gleitkommazahl : Um eine zufällige Gleitkommazahl zwischen
min
und zu erhaltenmax
, verwenden Sie den folgenden CodeReferenz: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
quelle
Mathematik ist nicht meine Stärke, aber ich habe an einem Projekt gearbeitet, bei dem ich viele Zufallszahlen zwischen positiv und negativ generieren musste.
Z.B
Natürlich können Sie auch eine Validierung hinzufügen, um sicherzustellen, dass Sie dies nur mit Zahlen tun. Stellen Sie außerdem sicher, dass min immer kleiner oder gleich max ist.
quelle
min + Math.random() * max
gibt Ihnen Zahlen zwischen min und min + max, was nicht das ist, was Sie wollen. Der erste Zweig vonif
ist korrekt, könnte aber vereinfacht gesagt werden. Diesreturn min + Math.random() * (max - min)
ist die richtige Lösung, unabhängig davon, ob min positiv oder negativ ist (siehe die anderen Antworten). Denken Sie auch daran, dass Sie das Ergebnis immer noch auf den Boden legen müssen, wenn Sie keine Brüche möchten.Ich habe eine flexiblere Funktion geschrieben, die Ihnen Zufallszahlen geben kann, aber nicht nur Ganzzahlen.
Feste Version.
quelle
Beispiel
Geben Sie eine Zufallszahl zwischen 1 und 10 zurück:
Das Ergebnis könnte sein:
3
Versuchen Sie es selbst: hier
- -
oder mit lodash / undescore:
_.random(min, max)
Docs: - lodash - undescore
quelle
Trotz vieler Antworten und fast gleichem Ergebnis. Ich möchte meine Antwort hinzufügen und ihre Funktionsweise erklären. Weil es wichtig ist, die Funktionsweise zu verstehen, anstatt das Einfügen eines Zeilencodes zu kopieren. Das Generieren von Zufallszahlen ist nichts anderes als einfache Mathematik.
CODE:
quelle
Ich habe nach einem in TypeScript geschriebenen Zufallszahlengenerator gesucht und dies nach dem Lesen aller Antworten geschrieben. Ich hoffe, es würde für TypeScript-Codierer funktionieren.
quelle
Math.random()
ist schnell und für viele Zwecke geeignet, aber nicht geeignet, wenn Sie kryptografisch sichere Werte benötigen (es ist nicht sicher) oder wenn Sie Ganzzahlen aus einer völlig einheitlichen unverzerrten Verteilung benötigen (der in anderen Antworten verwendete Multiplikationsansatz erzeugt bestimmte Werte etwas häufiger als andere).In solchen Fällen können wir
crypto.getRandomValues()
sichere Ganzzahlen generieren und generierte Werte ablehnen, die wir nicht einheitlich dem Zielbereich zuordnen können. Dies ist langsamer, sollte jedoch nur dann von Bedeutung sein, wenn Sie eine extrem große Anzahl von Werten generieren.Um das Problem der voreingenommenen Verteilung zu klären, betrachten Sie den Fall, in dem wir einen Wert zwischen 1 und 5 generieren möchten, aber einen Zufallszahlengenerator haben, der Werte zwischen 1 und 16 erzeugt (ein 4-Bit-Wert). Wir möchten, dass jedem Ausgabewert die gleiche Anzahl generierter Werte zugeordnet wird, aber 16 wird nicht gleichmäßig durch 5 geteilt: Es verbleibt ein Rest von 1. Wir müssen also 1 der möglichen generierten Werte ablehnen und erst fortfahren, wenn wir erhalten einer der 15 kleineren Werte, die einheitlich in unseren Zielbereich abgebildet werden können. Unser Verhalten könnte wie folgt aussehen: Pseudocode:
Der folgende Code verwendet eine ähnliche Logik, generiert jedoch stattdessen eine 32-Bit-Ganzzahl, da dies die größte gemeinsame Ganzzahlgröße ist, die durch den Standardtyp von JavaScript dargestellt werden kann
number
. (Dies kann geändert werden, umBigInt
s zu verwenden, wenn Sie einen größeren Bereich benötigen.) Unabhängig vom ausgewählten Bereich beträgt der Anteil der abgelehnten generierten Werte immer weniger als 0,5, sodass die erwartete Anzahl der Ablehnungen immer weniger als 1,0 und beträgt normalerweise nahe 0,0; Sie müssen sich keine Sorgen machen, dass es für immer eine Schleife gibt.quelle
Hinzufügen
float
mit einer Version mit fester Genauigkeit basierend auf derint
Version in der Antwort von @ Francisc:damit:
und für int Antwort
quelle
Kryptostarke zufällige Ganzzahl im Bereich [a, b] (Annahme: a <b)
quelle
Das sollte funktionieren:
quelle
Ich habe eine großartige neue Möglichkeit entdeckt, dies mit ES6-Standardparametern zu tun. Es ist sehr geschickt, da es entweder ein Argument oder zwei Argumente zulässt. Hier ist es:
quelle
Dies ist ungefähr neun Jahre zu spät, aber randojs.com macht dies zu einem einfachen Einzeiler :
Sie müssen dies nur zum Kopf Ihres HTML-Dokuments hinzufügen, und Sie können so ziemlich alles, was Sie wollen, mit Zufälligkeit leicht tun. Zufällige Werte von Arrays, zufällige Abfrageelemente, zufällige Eigenschaften von Objekten und sogar das Verhindern von Wiederholungen, falls erforderlich.
quelle
Dies funktioniert für mich und erzeugt Werte wie die Standardbibliotheksfunktion random.randint von Python :
quelle
Versuchen Sie es mit:
quelle
1-6 wie ein Würfel im Grunde zurückgeben,
quelle