Wie kann ich mit JavaScript eindeutige Zufallszahlen zwischen 1 und 100 generieren ?
javascript
random
integer
numbers
dotty
quelle
quelle
Antworten:
Beispiel: Um 8 eindeutige Zufallszahlen zu generieren und in einem Array zu speichern, gehen Sie einfach wie folgt vor:
quelle
Returns a random number between 0 (inclusive) and 1 (exclusive)
. Wennthe Math.random()
versehentlich 0 zurückgegeben wird,Math.ceil(0)
ist dies ebenfalls 0, obwohl die Chance gering ist.quelle
randlines file | head -10
.Generieren Sie eine Permutation von 100 Zahlen und wählen Sie dann seriell.
Verwenden Sie den Knuth Shuffle-Algorithmus (auch bekannt als Fisher-Yates-Shuffle) .
JavaScript:
CODE VON LINK KOPIERT.
EDIT :
Verbesserter Code:
Potenzielles Problem:
Angenommen, wir haben ein Array von 100 Zahlen {zB [1,2,3 ... 100]} und hören nach 8 Swaps auf zu tauschen. dann sieht das Array meistens wie folgt aus: {1,2,3,76,5,6,7,8, ... Zahlen hier werden gemischt ... 10}.
Weil jede Zahl mit einer Wahrscheinlichkeit von 1/100 getauscht wird, ist es wahrscheinlich. des Austauschs der ersten 8 Zahlen ist 8/100, während prob. der Austausch anderer 92 ist 92/100.
Wenn wir jedoch einen Algorithmus für ein vollständiges Array ausführen, sind wir sicher, dass (fast) jeder Eintrag ausgetauscht wird.
Ansonsten stehen wir vor der Frage: Welche 8 Zahlen sollen wir wählen?
quelle
Moderne JS-Lösung mit Set (und Durchschnittsfall O (n))
quelle
Math.floor(Math.random()*100) + 1
Set
in JS zu entdecken ! Würde diese Lösung jedoch nicht zu einer unnötigen Generierung von Zahlen führen, bis man die Anforderung der Eindeutigkeit erfüllt, insbesondere in den letzten Iterationen, wenn 8 näher an 100 liegt? Daher denke ich, ich bevorzuge die auch elegante Antwort mitsort
unten.Die oben genannten Techniken sind gut, wenn Sie eine Bibliothek vermeiden möchten. Abhängig davon, ob Sie mit einer Bibliothek einverstanden sind, würde ich empfehlen, die Möglichkeit zum Generieren von zufälligen Inhalten in JavaScript zu prüfen .
Speziell um Ihre Frage zu lösen, ist es mit Chance so einfach wie:
Haftungsausschluss, als Autor von Chance bin ich etwas voreingenommen;)
quelle
var codes = chance.unique(chance.string, 8)
Wenn Sie die Codes aus einem bestimmten Zeichenpoolchance.unique(chance.string, 8, {pool: "abcd1234"})
abrufen möchten, können Sie dies wie folgt angeben: wobei abcd1234 beliebige Zeichen im Pool sein können. Siehe Chancejs.com/#stringchance.string({ length: 8 })
und wenn Sie nur möchten, dass bestimmte Zeichen in dieser Zeichenfolge erscheinen,chance.string({ pool: 'abcd1234', length: 8 })
die eine zufällige 8-Zeichen-Zeichenfolge aus den Zeichen abcd1234 zurückgeben, also zum Beispiel "2c2c44bc" oder "331141cc"Um lange und unzuverlässige Mischvorgänge zu vermeiden, würde ich Folgendes tun ...
Voila - keine wiederholten Zahlen.
Ich kann später einen aktuellen Code veröffentlichen, wenn jemand interessiert ist.
Bearbeiten: Es ist wahrscheinlich die Konkurrenzserie in mir, aber nachdem ich den Beitrag von @Alsciende gesehen habe, konnte ich nicht widerstehen, den versprochenen Code zu veröffentlichen.
quelle
Ein anderer Ansatz besteht darin, ein Array mit 100 Elementen mit aufsteigenden Zahlen zu generieren und es zufällig zu sortieren. Dies führt tatsächlich zu einem wirklich kurzen und (meiner Meinung nach) einfachen Ausschnitt.
quelle
sort
ist gut implementiert, was ich sicher bin).Ich würde das tun:
quelle
Dies ist eine sehr generische Funktion, die ich geschrieben habe, um zufällige eindeutige / nicht eindeutige Ganzzahlen für ein Array zu generieren. Angenommen, der letzte Parameter ist in diesem Szenario für diese Antwort wahr.
Hier ist das 'tempObj' ein sehr nützliches Objekt, da jede generierte Zufallszahl dieses tempObj direkt eincheckt, wenn dieser Schlüssel bereits vorhanden ist. Wenn nicht, reduzieren wir das i um eins, da wir 1 zusätzlichen Lauf benötigen, da die aktuelle Zufallszahl bereits vorhanden ist .
Führen Sie in Ihrem Fall Folgendes aus
Das ist alles.
quelle
min = (min) ? min : 1,
gibt immer 1 zurück (daher wird 0 niemals ausgewählt)Das Mischen der Zahlen von 1 auf 100 ist die richtige Grundstrategie. Wenn Sie jedoch nur 8 gemischte Zahlen benötigen, müssen Sie nicht alle 100 Zahlen mischen.
Ich kenne Javascript nicht sehr gut, aber ich glaube, es ist einfach, schnell ein Array von 100 Nullen zu erstellen. Dann tauschen Sie für 8 Runden das n-te Element des Arrays (n beginnend bei 0) gegen ein zufällig ausgewähltes Element von n + 1 bis 99. Natürlich bedeuten alle Elemente, die noch nicht ausgefüllt sind, dass das Element wirklich gewesen wäre Der ursprüngliche Index plus 1, das ist also trivial zu berücksichtigen. Wenn Sie mit den 8 Runden fertig sind, haben die ersten 8 Elemente Ihres Arrays Ihre 8 gemischten Zahlen.
quelle
kürzer als andere Antworten, die ich gesehen habe
quelle
Gleicher Permutationsalgorithmus wie The Machine Charmer, jedoch mit einer prototypisierten Implementierung. Besser geeignet für eine große Anzahl von Picks. Verwendet die Destrukturierungszuweisung js 1.7, falls verfügbar.
Bearbeiten: Ein anderer Vorschlag, der besser für eine kleine Anzahl von Picks geeignet ist, basierend auf Belugabobs Antwort. Um die Eindeutigkeit zu gewährleisten, entfernen wir die ausgewählten Zahlen aus dem Array.
quelle
für Arrays mit
[,2,,4,,6,7,,]
solchen Löchern, weil mein Problem darin bestand, diese Löcher zu füllen. Also habe ich es nach meinen Wünschen modifiziert :)Die folgende modifizierte Lösung hat bei mir funktioniert :)
quelle
Die beste frühere Antwort ist die Antwort von
sje397
. Sie erhalten so schnell wie möglich so gute Zufallszahlen wie möglich.Meine Lösung ist seiner Lösung sehr ähnlich. Manchmal möchten Sie jedoch die Zufallszahlen in zufälliger Reihenfolge, und deshalb habe ich beschlossen, eine Antwort zu posten. Darüber hinaus biete ich eine allgemeine Funktion.
quelle
Hier ist meine ES6-Version, die ich zusammengeschustert habe. Ich bin sicher, es kann etwas konsolidierter sein.
quelle
Wie wäre es mit der Verwendung von Objekteigenschaften als Hash-Tabelle ? Auf diese Weise besteht Ihr bestes Szenario darin, nur 8 Mal zufällig zu wählen. Es wäre nur dann effektiv, wenn Sie einen kleinen Teil des Zahlenbereichs möchten. Es ist auch viel weniger speicherintensiv als Fisher-Yates, da Sie keinen Speicherplatz für ein Array zuweisen müssen.
Ich habe dann herausgefunden, dass Object.keys (obj) eine ECMAScript 5-Funktion ist, so dass das oben Genannte im Internet im Moment so gut wie nutzlos ist. Fürchte dich nicht, denn ich habe es ECMAScript 3-kompatibel gemacht, indem ich eine Tastenfunktion wie diese hinzugefügt habe.
quelle
quelle
Wenn Sie mehr eindeutige benötigen, müssen Sie ein Array (1..100) generieren.
Der obige Code ist schneller:
extractUniqueRandomArray (50) => [2, 79, 38, 59, 63, 42, 52, 22, 78, 50, 39, 77, 1, 88, 40, 23, 48, 84, 91, 49, 4, 54, 93, 36, 100, 82, 62, 41, 89, 12, 24, 31, 86, 92, 64, 75, 70, 61, 67, 98, 76, 80, 56, 90, 83, 44, 43, 47, 7, 53]
quelle
Hinzufügen einer weiteren besseren Version desselben Codes (akzeptierte Antwort) mit der JavaScript 1.6 indexOf-Funktion. Sie müssen nicht jedes Mal, wenn Sie das Duplikat überprüfen, das gesamte Array durchlaufen.
Ältere Versionen von Javascript können weiterhin die Version oben verwenden
PS: Ich habe versucht, ein Update für das Wiki vorzuschlagen, aber es wurde abgelehnt. Ich denke immer noch, dass es für andere nützlich sein kann.
quelle
Dies ist meine persönliche Lösung:
Es werden zufällig 8 eindeutige Array-Werte (zwischen 0 und 7) generiert und anschließend mithilfe eines Warnfelds angezeigt.
quelle
Ich denke, diese Methode unterscheidet sich von den in den meisten Antworten angegebenen Methoden, daher dachte ich, ich könnte hier eine Antwort hinzufügen (obwohl die Frage vor 4 Jahren gestellt wurde).
Wir generieren 100 Zufallszahlen und markieren jede mit Zahlen von 1 bis 100. Dann sortieren wir diese markierten Zufallszahlen und die Tags werden zufällig gemischt. Alternativ könnte man, wie in dieser Frage benötigt, darauf verzichten, nur die Top 8 der markierten Zufallszahlen zu finden. Das Finden der Top-8-Elemente ist billiger als das Sortieren des gesamten Arrays.
Hierbei ist zu beachten, dass der Sortieralgorithmus diesen Algorithmus beeinflusst. Wenn der verwendete Sortieralgorithmus stabil ist, besteht eine leichte Verzerrung zugunsten kleinerer Zahlen. Idealerweise möchten wir, dass der Sortieralgorithmus instabil und nicht einmal auf Stabilität (oder Instabilität) ausgerichtet ist, um eine Antwort mit perfekt gleichmäßiger Wahrscheinlichkeitsverteilung zu erhalten.
quelle
Dies kann die Erzeugung von bis zu 20-stelligen EINZIGARTIGEN Zufallszahlen verarbeiten
JS
jsFiddle
quelle
Diese Lösung verwendet den Hash, der viel leistungsfähiger ist als die Überprüfung, ob sich der Hash im Array befindet. Es hat auch extra sichere Kontrollen. Ich hoffe es hilft.
quelle
Die Implementierung als Generator macht es ziemlich schön, damit zu arbeiten. Beachten Sie, dass sich diese Implementierung von denen unterscheidet, bei denen das gesamte Eingabearray zuerst gemischt werden muss.
Ich habe mich für eine Implementierung entschieden, die
sample
das Eingabearray nicht mutiert, aber Sie könnten leicht argumentieren, dass eine mutierende Implementierung günstig ist.Beispielsweise
shuffle
möchte die Funktion möglicherweise das ursprüngliche Eingabearray mutieren. Oder Sie möchten zu verschiedenen Zeiten von derselben Eingabe abtasten und die Eingabe jedes Mal aktualisieren.sample
ist aufgrund der Array-Eingangsmutation keine reine Funktion mehr , kann aber unter bestimmten Umständen (siehe oben) sinnvoller sein.Ein weiterer Grund, warum ich einen Generator anstelle einer Funktion gewählt habe, die nur ein Array zurückgibt, ist, dass Sie die Abtastung möglicherweise bis zu einer bestimmten Bedingung fortsetzen möchten.
Vielleicht möchte ich die erste Primzahl aus einer Liste von 1.000.000 Zufallszahlen.
Da wir mit einem Generator arbeiten, ist diese Aufgabe trivial
Dadurch wird kontinuierlich jeweils 1 Zufallszahl abgetastet.
x
Überprüfen Sie, ob es sich um eine Primzahl handelt, und kehrenx
Sie dann zurück, wenn dies der Fall ist. Wenn die Liste der Zahlen erschöpft ist, bevor eine Primzahl gefunden wird,NaN
wird sie zurückgegeben.Hinweis:
Diese Antwort wurde ursprünglich auf eine andere Frage übertragen, die als Duplikat dieser Frage geschlossen wurde. Da es sich stark von den anderen hier angebotenen Lösungen unterscheidet, habe ich beschlossen, es auch hier zu teilen
quelle
quelle
Die Verwendung von a
Set
ist Ihre schnellste Option. Hier ist eine generische Funktion zum Abrufen eines eindeutigen Zufalls, der einen Rückrufgenerator verwendet. Jetzt ist es schnell und wiederverwendbar .quelle
Dies ist eine Implementierung von Fisher Yates / Durstenfeld Shuffle , jedoch ohne tatsächliche Erstellung eines Arrays, wodurch die Platzkomplexität oder der benötigte Speicher reduziert werden, wenn die Vergleich zur Anzahl der verfügbaren Elemente klein ist.
Um 8 von 100 Zahlen auszuwählen, muss kein Array mit 100 Elementen erstellt werden.
Angenommen, ein Array wird erstellt.
rnd
) von 1 bis 100rnd
Wenn kein Array erstellt wird, kann eine HashMap verwendet werden, um die tatsächlich getauschten Positionen zu speichern. Wenn die zweite generierte Zufallszahl gleich der zuvor generierten Zahl ist, liefert die Karte den aktuellen Wert an dieser Position anstelle des tatsächlichen Werts.
quelle
Hier ist ein Beispiel für zufällige 5 Zahlen aus einem Bereich von 0 bis 100 (sowohl 0 als auch 100 enthalten) ohne Duplizierung.
quelle
Sie können dies auch mit einem Einzeiler wie diesem tun:
[...((add, set) => add(set, add))((set, add) => set.size < 8 ? add(set.add(Math.floor(Math.random()*100) + 1), add) : set, new Set())]
quelle