Ich versuche, Zufallszahlen zwischen 0 und 100 zu erhalten. Aber ich möchte, dass sie eindeutig sind und nicht in einer Sequenz wiederholt werden. Wenn ich zum Beispiel 5 Zahlen habe, sollten sie 82,12,53,64,32 sein und nicht 82,12,53,12,32. Ich habe dies verwendet, aber es werden die gleichen Zahlen in einer Sequenz generiert.
Random rand = new Random();
selected = rand.nextInt(100);
1..100
(dafür gibt es bekannte Algorithmen), aber aufhören, nachdem Sie die erstenn
Elemente ermittelt haben.Antworten:
Hier ist eine einfache Implementierung. Dadurch werden 3 eindeutige Zufallszahlen aus dem Bereich von 1 bis 10 gedruckt.
Der erste Teil des Fixes mit dem ursprünglichen Ansatz besteht, wie Mark Byers in einer jetzt gelöschten Antwort hervorhob, darin, nur eine einzige
Random
Instanz zu verwenden.Das führt dazu, dass die Zahlen identisch sind. Eine
Random
Instanz wird durch die aktuelle Zeit in Millisekunden gesetzt. Für einen bestimmten Startwert gibt die 'zufällige' Instanz genau dieselbe Folge von Pseudozufallszahlen zurück .Die erste for-Schleife kann einfach geändert werden in:
quelle
Mit Java 8+ können Sie die
ints
Methode verwendenRandom
, umIntStream
dann zufällige Werte abzurufendistinct
undlimit
den Stream auf eine Reihe eindeutiger zufälliger Werte zu reduzieren.Random
hat auch Methoden, dieLongStream
s und erstellenDoubleStream
s wenn Sie diese stattdessen benötigen.Wenn Sie alle (oder eine große Anzahl) Zahlen in einem Bereich in zufälliger Reihenfolge möchten, ist es möglicherweise effizienter, alle Zahlen zu einer Liste hinzuzufügen, sie zu mischen und das erste n zu verwenden, da das obige Beispiel derzeit implementiert ist durch Generieren von Zufallszahlen in dem angeforderten Bereich und Durchlaufen dieser durch einen Satz (ähnlich wie bei Rob Kieltys Antwort ), bei dem möglicherweise viel mehr als der zur Begrenzung übergebene Betrag generiert werden muss, da die Wahrscheinlichkeit, eine neue eindeutige Zahl zu generieren, mit jeder gefundenen Zahl abnimmt. Hier ist ein Beispiel für den anderen Weg:
quelle
Arrays#setAll()
ist etwas schneller als ein Stream. Also: `Integer [] Indizes = neue Integer [n]; Arrays.setAll (Indizes, i -> i); Collections.shuffle (Arrays.asList (Indizes)); return Arrays.stream (Indizes) .mapToInt (Integer :: intValue) .toArray (); `long
dem Sie verschieben und maskieren, um auf einzelne Bits zuzugreifen.)quelle
pick()
ist ein Beispiel.HashSet
, in dem Sie die bereits generierten Zahlen speichern undcontains
testen, ob Sie diese Zahl bereits generiert haben. DasHashSet
ist wahrscheinlich etwas langsamer als ein boolesches Array, beansprucht aber weniger Speicher.Verwenden Sie
Collections.shuffle()
für alle 100 Zahlen und wählen Sie die ersten fünf aus, wie hier gezeigt .quelle
Ich denke, diese Methode ist erwähnenswert.
quelle
Ich habe Anands Antwort überarbeitet, um nicht nur die eindeutigen Eigenschaften eines Sets zu nutzen, sondern auch den booleschen Wert false zu verwenden, der von zurückgegeben wird,
set.add()
wenn ein Hinzufügen zum Set fehlschlägt.quelle
SET_SIZE_REQUIRED
es groß genug ist (sagen wir, mehr alsNUMBER_RANGE / 2
dann haben Sie eine viel größere erwartete Laufzeit.Ich habe das so gemacht.
quelle
Dies wird funktionieren, um eindeutige Zufallszahlen zu generieren ................
quelle
Eine clevere Möglichkeit, dies zu tun, besteht darin, Exponenten eines primitiven Elements im Modul zu verwenden.
Zum Beispiel ist 2 ein primitiver Root-Mod 101, was bedeutet, dass die Potenzen von 2 Mod 101 Ihnen eine sich nicht wiederholende Sequenz geben, die jede Zahl von 1 bis einschließlich 100 sieht:
In Java-Code würden Sie schreiben:
Es kann schwierig sein, eine primitive Wurzel für einen bestimmten Modul zu finden, aber die "Primroot" -Funktion von Maple erledigt dies für Sie.
quelle
Ich bin von einer anderen Frage hierher gekommen, die ein Duplikat dieser Frage war ( Generieren einer eindeutigen Zufallszahl in Java ).
Speichern Sie 1 bis 100 Zahlen in einem Array.
Generieren Sie eine Zufallszahl zwischen 1 und 100 als Position und geben Sie das Array [Position-1] zurück, um den Wert zu erhalten
Wenn Sie eine Zahl im Array verwenden, markieren Sie den Wert als -1 (Sie müssen kein anderes Array pflegen, um zu überprüfen, ob diese Zahl bereits verwendet wird).
Wenn der Wert im Array -1 ist, rufen Sie die Zufallszahl erneut ab, um eine neue Position im Array abzurufen.
quelle
Ich habe eine einfache Lösung für dieses Problem. Damit können wir leicht n eindeutige Zufallszahlen generieren. Es ist nur eine Logik, die jeder in jeder Sprache verwenden kann.
quelle
Probieren Sie es aus
quelle
Dies unterscheidet sich nicht wesentlich von anderen Antworten, aber ich wollte am Ende das Array von ganzen Zahlen:
quelle
Sie können ein boolesches Array verwenden, um den Wert true zu füllen, wenn der Wert andernfalls festgelegt ist. Navigieren Sie durch das boolesche Array, um den unten angegebenen Wert zu erhalten
quelle
Wählen Sie n eindeutige Zufallszahlen von 0 bis m-1.
Stellen Sie sich eine Liste mit Zahlen von 0 bis m-1 vor. Um die erste Nummer zu wählen, verwenden wir einfach
rand.nextInt(m)
. Entfernen Sie dann die Nummer aus der Liste. Jetzt bleiben m-1 Nummern, also rufen wir anrand.nextInt(m-1)
. Die Zahl, die wir erhalten, repräsentiert die Position in der Liste. Wenn es kleiner als die erste Nummer ist, ist es die zweite Nummer, da der Teil der Liste vor der ersten Nummer durch das Entfernen der ersten Nummer nicht geändert wurde. Wenn die Position größer oder gleich der ersten Zahl ist, ist die zweite Zahl Position + 1. Führen Sie eine weitere Ableitung durch, Sie können diesen Algorithmus erhalten.Erläuterung
Dieser Algorithmus hat eine O (n ^ 2) -Komplexität. Es ist also gut, um aus einer großen Menge eine kleine Menge eindeutiger Zahlen zu generieren. Während der Shuffle-basierte Algorithmus mindestens O (m) benötigt, um das Shuffle durchzuführen.
Auch Shuffle-basierte Algorithmen benötigen Speicher, um jedes mögliche Ergebnis für das Shuffle zu speichern. Dieser Algorithmus benötigt keinen Speicher.
quelle
Sie können die Collections-Klasse verwenden.
Eine Dienstprogrammklasse mit dem Namen "Sammlungen" bietet verschiedene Aktionen, die für eine Sammlung wie eine ArrayList ausgeführt werden können (z. B. Durchsuchen der Elemente, Suchen des maximalen oder minimalen Elements, Umkehren der Reihenfolge der Elemente usw.). Eine der Aktionen, die ausgeführt werden können, besteht darin, die Elemente zu mischen. Durch das Mischen wird jedes Element zufällig an eine andere Position in der Liste verschoben. Dazu wird ein zufälliges Objekt verwendet. Dies bedeutet, dass es deterministische Zufälligkeit ist, aber in den meisten Situationen.
Um die ArrayList zu mischen, fügen Sie den Collections-Import oben im Programm hinzu und verwenden Sie dann die statische Shuffle-Methode. Die ArrayList muss als Parameter gemischt werden:
quelle
Es ist zwar ein alter Thread, aber das Hinzufügen einer weiteren Option kann nicht schaden. (JDK 1.8 Lambda-Funktionen scheinen es einfach zu machen);
Das Problem kann in die folgenden Schritte unterteilt werden:
Hier ist die Funktion mit einer Beschreibung:
Um 11 eindeutige Zufallszahlen für das Listenobjekt 'allIntegers' zu erhalten, rufen wir die Funktion wie folgt auf:
Die Funktion deklariert die neue ArrayList 'generateUniqueIds' und füllt sie mit jeder eindeutigen zufälligen Ganzzahl bis zur erforderlichen Anzahl, bevor sie zurückkehrt.
Die PS ThreadLocalRandom-Klasse vermeidet bei gleichzeitigen Threads den allgemeinen Startwert.
quelle
Dies ist die einfachste Methode, um eindeutige Zufallswerte in einem Bereich oder aus einem Array zu generieren .
In diesem Beispiel verwende ich ein vordefiniertes Array, aber Sie können diese Methode auch anpassen, um Zufallszahlen zu generieren. Zuerst erstellen wir ein Beispielarray, aus dem wir unsere Daten abrufen können.
Aus dem werden
sampleList
wir nun fünf Zufallszahlen erzeugen, die eindeutig sind.Dies ist konzeptionell sehr einfach. Wenn der generierte Zufallswert bereits vorhanden ist, wiederholen wir den Schritt. Dies wird fortgesetzt, bis alle generierten Werte eindeutig sind.
Wenn Sie diese Antwort nützlich fanden, können Sie sie abstimmen, da das Konzept im Vergleich zu den anderen Antworten sehr einfach ist .
quelle
Sie können in Java n eindeutige Zufallszahlen zwischen 0 und n-1 generieren
}}
quelle
Überprüfen Sie dies
quelle
Im Folgenden finden Sie eine Methode, mit der ich immer eine eindeutige Nummer generiert habe. Die Zufallsfunktion generiert eine Nummer und speichert sie in einer Textdatei. Beim nächsten Einchecken in eine Datei wird sie verglichen und eine neue eindeutige Nummer generiert. Auf diese Weise gibt es immer eine neue eindeutige Nummer.
quelle