Wie kann ich zufällige ganze Zahlen zwischen zwei angegebenen Variablen in JavaScript generieren, z. B. x = 4
und y = 8
eine davon ausgeben 4, 5, 6, 7, 8
?
javascript
random
integer
zacharyliu
quelle
quelle
Antworten:
Auf der Seite Mozilla Developer Network finden Sie einige Beispiele :
Hier ist die Logik dahinter. Es ist eine einfache Dreierregel:
Math.random()
Gibt aNumber
zwischen 0 (einschließlich) und 1 (exklusiv) zurück. Wir haben also ein Intervall wie dieses:Nun möchten wir eine Zahl zwischen
min
(inklusive) undmax
(exklusiv):Wir können das verwenden
Math.random
, um den Korrespondenten im Intervall [min, max) zu erhalten. Aber zuerst sollten wir das Problem ein wenig berücksichtigen, indem wirmin
vom zweiten Intervall abziehen :Das gibt:
Wir können uns jetzt bewerben
Math.random
und dann den Korrespondenten berechnen. Wählen wir eine Zufallszahl:Um zu finden
x
, würden wir tun:Vergessen Sie nicht, etwas hinzuzufügen
min
, damit wir im Intervall [min, max) eine Zahl erhalten:Das war die erste Funktion von MDN. Die zweite gibt eine Ganzzahl zwischen
min
undmax
einschließlich zurück.Jetzt für ganze Zahlen bekommen, könnten Sie verwenden
round
,ceil
oderfloor
.Sie könnten verwenden
Math.round(Math.random() * (max - min)) + min
, dies ergibt jedoch eine ungleichmäßige Verteilung. Beidemin
und habenmax
nur ungefähr die Hälfte der Chance zu würfeln:Mit
max
aus dem Intervall ausgeschlossen, hat es eine noch geringere Chance zu rollen alsmin
.Mit haben
Math.floor(Math.random() * (max - min +1)) + min
Sie eine vollkommen gleichmäßige Verteilung.Sie können
ceil()
und-1
in dieser Gleichung nicht verwenden , damax
jetzt eine etwas geringere Chance zum Würfeln bestand, aber Sie können auch das (unerwünschte)min-1
Ergebnis würfeln .quelle
floor
, was abrundet.round
aber beides benutzenmin
und hattemax
nur die halbe Chance zu würfeln wie die anderen Zahlen. Sie könnten auch eine subtrahieren und nehmenceil
. Dies lässt jedoch diemax
Zahl aufgrund des[0,1)
Intervalls mit einer minimal geringeren Wahrscheinlichkeit zu würfeln .quelle
(Math.random() * (maximum - minimum + 1) ) << 0
ist schneller.x << 0
,x | 0
,~~x
) anstelle vonMath.floor()
Konvertitenx
in eine zwei Ergänzung mit vielen kleineren Bereich alsNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs. 2⁵³), so müssen Sie es mit Vorsicht verwenden!657348096152|0
Sie 218099864 (11001111111111000010011000 in binär).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
Verwendungszweck:
Nervenzusammenbruch:
Wir geben eine Funktion zurück (aus der funktionalen Programmierung entlehnt), die beim Aufruf eine zufällige Ganzzahl zwischen den Werten
bottom
undtop
einschließlich zurückgibt. Wir sagen "inklusive", weil wir sowohl unten als auch oben in den Bereich der Zahlen aufnehmen möchten, die zurückgegeben werden können. Auf diese WeisegetRandomizer( 1, 6 )
wird entweder 1, 2, 3, 4, 5 oder 6 zurückgegeben.(unten ist niedrigere Zahl, oben ist größere Zahl)
Math.random()
Gibt ein zufälliges Doppel zwischen 0 und 1 zurück. Wenn wir es mit eins plus der Differenz zwischentop
und multiplizierenbottom
, erhalten wir irgendwo zwischen0
und ein Doppel1+b-a
.Math.floor
rundet die Zahl auf die nächste ganze Zahl ab. Wir haben jetzt alle ganzen Zahlen zwischen0
undtop-bottom
. Die 1 sieht verwirrend aus, muss aber vorhanden sein, da wir immer abrunden, sodass die höchste Zahl ohne sie eigentlich nie erreicht wird. Die zufällige Dezimalstelle, die wir generieren, muss im Bereich0
bis liegen ,(1+top-bottom)
damit wir abrunden und ein Int im Bereich0
bis erhalten könnentop-bottom
Der Code im vorherigen Beispiel gab uns eine ganze Zahl im Bereich
0
undtop-bottom
, so alles , was wir jetzt tun müssen , ist hinzuzufügen ,bottom
zu diesem Ergebnis eine ganze Zahl im Bereich zu bekommenbottom
undtop
inklusive. : D.HINWEIS: Wenn Sie zuerst einen nicht ganzzahligen Wert oder die größere Zahl übergeben, erhalten Sie unerwünschtes Verhalten. Wenn jedoch niemand dies anfordert, werde ich mich nicht mit dem Code zur Argumentprüfung befassen, da er weit von der Absicht der ursprünglichen Frage entfernt ist .
quelle
Alternativ, wenn Sie Underscore.js verwenden , können Sie verwenden
quelle
_.uniqueId()
Funktion, die Sie für clientseitige Modelle aufrufen können.x << 0
,x | 0
,~~x
) anstelle vonMath.floor()
Konvertitenx
in eine zwei Ergänzung mit viel kleineren Bereich alsNumber.MAX_SAFE_INTEGER
(2³²⁻¹ vs. 2⁵³), so haben Sie es verwenden , um mit Vorsicht!Geben Sie eine Zufallszahl zwischen 1 und 10 zurück:
Geben Sie eine Zufallszahl zwischen 1 und 100 zurück:
quelle
Wenn Sie eine Variable zwischen 0 und max benötigen, können Sie Folgendes verwenden:
quelle
Die anderen Antworten berücksichtigen nicht die völlig vernünftigen Parameter von
0
und1
. Verwenden Sieround
stattdessen anstelle vonceil
oderfloor
:quelle
console.log(randomNumber(5,6)); # 9 6 6 5 7 7
Kommen 9 & 7 zwischen 5 & 6? ...... du solltest es korrigieren oder erklären ..Hier ist die MS DotNet-Implementierung der Zufallsklasse in Javascript-
Verwenden:
quelle
Verwenden Sie diese Funktion, um Zufallszahlen zwischen bestimmten Bereichen zu erhalten
quelle
Nach dem Generieren einer Zufallszahl mit einem Computerprogramm wird immer noch als Zufallszahl betrachtet, ob die ausgewählte Zahl ein Teil oder die vollständige der ursprünglichen Zahl ist. Wenn es jedoch geändert wurde, akzeptieren Mathematiker es nicht als Zufallszahl und können es als voreingenommene Zahl bezeichnen. Wenn Sie jedoch ein Programm für eine einfache Aufgabe entwickeln, ist dies nicht zu berücksichtigen. Wenn Sie jedoch ein Programm entwickeln, um eine Zufallszahl für wertvolle Dinge wie ein Lotterieprogramm oder ein Glücksspiel zu generieren, wird Ihr Programm vom Management abgelehnt, wenn Sie den oben genannten Fall nicht berücksichtigen.
Für diese Art von Menschen ist hier mein Vorschlag:
Generieren Sie eine Zufallszahl mit
Math.random()
. (Sagen Sie diesn
)Wenn Sie wissen, wie man eine Zufallszahlentabelle liest, um eine Zufallszahl auszuwählen, wissen Sie, dass der obige Prozess (Multiplizieren mit 1, 10, 100 usw.) nicht gegen den Prozess verstößt, den ich am Anfang erwähnt habe (weil er nur die ändert) Stelle des Dezimalpunktes.)
Studieren Sie das folgende Beispiel und entwickeln Sie es entsprechend Ihren Anforderungen.
Wenn Sie eine Stichprobe [0,9] benötigen, ist der Boden von n * 10 Ihre Antwort, und wenn Sie [0,99] benötigen, ist der Boden von n * 100 Ihre Antwort und so weiter.
Lassen Sie uns nun in Ihre Rolle eintreten:
Sie haben Zahlen in einem bestimmten Bereich abgefragt. (In diesem Fall sind Sie in diesem Bereich voreingenommen. - Wenn Sie eine Zahl aus [1,6] nehmen, indem Sie einen Würfel werfen, werden Sie in [1,6] voreingenommen, aber es ist immer noch ein Zufall, wenn der Würfel unvoreingenommen ist .)
Betrachten Sie also Ihren Bereich ==> [78, 247] Anzahl der Elemente des Bereichs = 247 - 78 + 1 = 170; (da beide Grenzen inklusive sind.
Hinweis: In Methode 1 habe ich zuerst ein Array erstellt, das die benötigten Zahlen enthält, und diese dann zufällig in ein anderes Array eingefügt. Generieren Sie in Methode 2 zufällig Zahlen und überprüfen Sie, ob diese in dem von Ihnen benötigten Bereich liegen. Dann legen Sie es in ein Array. Hier habe ich zwei Zufallszahlen generiert und insgesamt verwendet, um die Geschwindigkeit des Programms zu maximieren, indem die Fehlerrate minimiert wurde, mit der eine nützliche Zahl erhalten wurde. Das Hinzufügen generierter Zahlen führt jedoch auch zu einer gewissen Verzerrung. Daher würde ich meine erste Methode empfehlen, um Zufallszahlen innerhalb eines bestimmten Bereichs zu generieren.
Bei beiden Methoden zeigt Ihre Konsole das Ergebnis an. (Drücken Sie in Chrome f12, um die Konsole zu öffnen.)
quelle
Math.floor(Math.random() * (6 - 1 + 1) + 1)
] die Zahlen 1 und 6 notwendigerweise weniger oft als 2, 3, 4 und 5 gewürfelt werden. Der Unterschied ist jedoch grundsätzlich unbedeutend.Versuchen Sie für eine zufällige Ganzzahl mit einem Bereich:
quelle
Um diese Funktion und Variationen dieser Funktion zu testen, speichern Sie das folgende HTML / JavaScript in einer Datei und öffnen Sie es mit einem Browser. Der Code erzeugt ein Diagramm, das die Verteilung von einer Million Funktionsaufrufen zeigt. Der Code zeichnet auch die Kantenfälle auf. Wenn die Funktion also einen Wert erzeugt, der größer als das Maximum oder kleiner als das Min ist, wissen Sie es.
quelle
Um eine Zufallszahl zwischen 1 und 6 zu erhalten, gehen Sie zunächst wie folgt vor:
Dies multipliziert eine Zufallszahl mit 6 und addiert dann 0,5 dazu. Runden Sie die Zahl als nächstes auf eine positive ganze Zahl, indem Sie Folgendes tun:
Dies rundet die Zahl auf die nächste ganze Zahl.
Oder um es verständlicher zu machen, tun Sie Folgendes:
Im Allgemeinen lautet der Code für die Verwendung von Variablen:
Der Grund für das Entfernen von 0,5 vom Minimalwert liegt darin, dass Sie mit dem Minimalwert allein eine Ganzzahl erhalten können, die um eins über Ihrem Maximalwert liegt. Indem Sie 0,5 vom Minimalwert wegnehmen, verhindern Sie im Wesentlichen, dass der Maximalwert aufgerundet wird.
Ich hoffe, das hilft.
quelle
Mit dem folgenden Code können Sie eine Reihe von Zufallszahlen in einem bestimmten Bereich generieren, ohne sie zu wiederholen.
quelle
Ich weiß, dass diese Frage bereits beantwortet ist, aber meine Antwort könnte jemandem helfen.
Ich habe diese einfache Methode auf W3Schools gefunden:
Hoffe das würde jemandem helfen.
quelle
Zufällige ganze Zahl zwischen niedrigster und höchster:
Nicht die eleganteste Lösung ... aber etwas schnelles.
quelle
Folgendes verwende ich, um Zufallszahlen zu generieren.
Wir führen aus,
high++
weilMath.random()
eine Zufallszahl zwischen 0 (einschließlich) und 1 (exklusiv) generiert wird. Die ausgeschlossene Zahl bedeutet, dass wir das Hoch um eins erhöhen müssen, bevor wir eine Mathematik ausführen. Wir subtrahieren dann niedrig von hoch, was uns die höchste zu erzeugende Zahl gibt - niedrig, dann + niedrig, um hoch wieder normal zu machen und die niedrigste Zahl mindestens niedrig zu machen. dann geben wir die resultierende Zahl zurückrandom(7,3)
könnte zurückkehren3,4,5,6, or 7
quelle
high
nur einmal verwendet wird, können Sie auchhigh-low+1
die separate Inkrement-Anweisung verwenden, anstatt sie zu verwenden. Außerdem würden die meisten Benutzer erwarten, dass derlow
Parameter an erster Stelle steht.Uint8Array erstellt ein Array mit einer Zahl von bis zu 3 Ziffern, was maximal 999 entspricht. Dieser Code ist sehr kurz.
quelle
Hier ist ein Beispiel für eine Javascript-Funktion, die ohne Verwendung von Math.random () eine Zufallszahl beliebiger Länge generieren kann :
quelle
Dies ist meine Einstellung zu einer Zufallszahl in einem Bereich, da ich eine Zufallszahl innerhalb eines Bereichs von Basis zu Exponent erhalten wollte. zB base = 10, exponent = 2, ergibt im Idealfall eine Zufallszahl von 0 bis 100 und so weiter.
Wenn es hilft, es zu benutzen, ist es hier:
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 verwenden
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
Kryptostark
Um Krypto starke zufällige ganze Zahl in Ragne [x, y] try
quelle
Sie können Sie dieses Code-Snippet,
quelle
do - while
anstelle vonwhile
Ionuț G. Stan hat eine großartige Antwort geschrieben, aber sie war etwas zu komplex, als dass ich sie hätte begreifen können. Daher fand ich unter https://teamtreehouse.com/community/mathfloor-mathrandom-max-min-1-min-explanation von Jason Anello eine noch einfachere Erklärung derselben Konzepte .
HINWEIS: Das einzig Wichtige, was Sie wissen sollten, bevor Sie Jasons Erklärung lesen, ist die Definition von "Abschneiden". Er benutzt diesen Begriff bei der Beschreibung
Math.floor()
. Das Oxford-Wörterbuch definiert "abschneiden" als:quelle
Dies kann die Erzeugung von bis zu 20-stelligen EINZIGARTIGEN Zufallszahlen verarbeiten
JS
JsFiddle
quelle
/ * Eine Funktion namens
randUpTo
aufrufen, die eine Zahl akzeptiert und eine zufällige ganze Zahl zwischen 0 und dieser Zahl zurückgibt? * // * Schreibe eine Funktion namens
randBetween
, die zwei Zahlen akzeptiert, die einen Bereich darstellen, und eine zufällige ganze Zahl zwischen diesen beiden Zahlen zurückgibt. * // * Schreibe eine aufgerufene Funktion
randFromTill
, die zwei Zahlen akzeptiert, die einen Bereich darstellen, und eine Zufallszahl zwischen min (einschließlich) und max (exklusiv) zurückgibt. * // * Schreibe eine aufgerufene Funktion
randFromTo
, die zwei Zahlen akzeptiert, die einen Bereich darstellen, und eine zufällige Ganzzahl zwischen min (einschließlich) und max (einschließlich) zurückgibt * /quelle
Ich habe diese Funktion erstellt, die Optionen wie min, max, exclude (eine Liste der auszuschließenden Ints) und seed (falls Sie einen gesetzten Zufallsgenerator wünschen) berücksichtigt.
Es kann verwendet werden wie:
Oder einfacher:
Dann können Sie tun:
Inhalt: https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e
quelle
Math.floor rundet eine Zahl auf die nächste Ganzzahl ab
Um eine zufällige Ganzzahl zwischen 4 und 8 einschließlich zu generieren, rufen Sie die obige Funktion mit den folgenden Argumenten auf:
quelle
Meine Methode zur Erzeugung einer Zufallszahl zwischen 0 und n, wobei n <= 10 (n ausgeschlossen):
quelle