Java-Generierung nicht wiederholende Zufallszahlen
Möchte ich erstellen Sie eine Reihe von Zufallszahlen ohne Duplikate in Java.
Zum Beispiel habe ich ein array zum speichern von 10.000 zufällige Ganzzahlen von 0 bis 9999.
Hier ist was ich habe, so weit:
import java.util.Random;
public class Sort{
public static void main(String[] args){
int[] nums = new int[10000];
Random randomGenerator = new Random();
for (int i = 0; i < nums.length; ++i){
nums[i] = randomGenerator.nextInt(10000);
}
}
}
Aber der obige code erzeugt Duplikate. Wie kann ich sicherstellen, dass die Zufallszahlen nicht wiederholen?
mögliche Duplikate von eine eindeutige Zufallszahlen in Java
Aber wenn Sie zu entfernen, wiederholte zahlen, dann sind Sie nicht so random
Möchten Sie alle 10.000 zahlen im array in zufälliger Reihenfolge, oder wollen Sie 10.000 Zufallszahlen? weil Sie nicht haben, können 10.000 Zufallszahlen im Bereich von 0 - 9.999 (dann sind Sie nicht zufällig mehr)
Ja nur ich will Sie nicht wiederholen, dass ist das wichtigste.
Wollen Sie es nicht zu wiederholen, in der Art von "1 1 2" wiederholt? "1 2 1" eine akzeptable Sequenz?
Aber wenn Sie zu entfernen, wiederholte zahlen, dann sind Sie nicht so random
Möchten Sie alle 10.000 zahlen im array in zufälliger Reihenfolge, oder wollen Sie 10.000 Zufallszahlen? weil Sie nicht haben, können 10.000 Zufallszahlen im Bereich von 0 - 9.999 (dann sind Sie nicht zufällig mehr)
Ja nur ich will Sie nicht wiederholen, dass ist das wichtigste.
Wollen Sie es nicht zu wiederholen, in der Art von "1 1 2" wiederholt? "1 2 1" eine akzeptable Sequenz?
InformationsquelleAutor Fernando Martinez | 2013-04-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beispiel:
Ich erstellte array-und hergeschoben. Ich bin nicht sicher, aber ich denke mal die Komplexität der shuffle sollte O(n). Denn wenn nur tun swapping zufällig innerhalb eines Arrays.
InformationsquelleAutor Achintya Jha
Einen einfachen Algorithmus, die Ihnen Zufallszahlen ohne Duplikate können gefunden werden in dem Buch Programming Pearls p. 127.
Aufmerksamkeit: Das resultierende array enthält die Nummern in der Reihenfolge! Wenn Sie wollen, dass Sie in zufälliger Reihenfolge, die Sie haben, um den shuffle-array entweder mit Fisher–Yates-shuffle oder über eine Liste und rufen
Collections.shuffle()
.Der Vorteil dieses Algorithmus ist, dass Sie nicht brauchen, um ein array erstellen mit allen möglichen zahlen, und die Laufzeit-Komplexität ist immer noch linear
O(n)
.Collections.shuffle
ist dabei ein Fisher-Yates-shuffle, es ist also nicht ein "entweder-oder" - situation.Sie haben Recht, die
Collections.shuffle
hat eine Fisher-Yates-shuffle, aber Sie brauchen eineList
es zu benutzen.Arrays.asList
muss das array als array vom TypInteger
stattint
um die Konvertierung zu tun korrekt, dann müssen Sie nicht haben, um zusätzlichen Speicher zuweisen. Schreiben Sie die Fisher-Yates-shuffle selbst vermeidet Konvertierung und keine zusätzlichen Speicher erforderlich ist.nur versuchen zu verstehen, warum
probability < ((double) count) / (double) remaining
benötigt wird? warum nicht füllen Sie das array von Anfang bis Ende und nur shuffle?InformationsquelleAutor the
Achintya Ji hat die richtige Idee hier. Statt darüber nachzudenken, wie, um Duplikate entfernen, entfernen Sie die Fähigkeit für Duplikate erstellt werden, in den ersten Platz.
Wenn Sie wollen stick mit einem array von ints und wollen, mischen Sie Ihre Bestellung (manuell, was ganz einfach ist) gehen Sie folgendermaßen vor.
Könnte der code geändert werden, wie folgt Aussehen:
Und wenn ich du wäre würde ich wahrscheinlich Pause jeder dieser Blöcke in separate, kleinere Methoden anstatt eine große main-Methode.
Hoffe, das hilft.
InformationsquelleAutor Benjamin Brumfield
Wenn Sie brauchen, erzeugen zahlen mit Intervallen, es ist nur so:
Das Ergebnis:
[1, 10, 2, 4, 9, 8, 7, 13, 18, 17, 5, 21, 12, 16, 23, 20, 6, 0, 22, 14, 24, 15, 3, 11, 19]
Hinweis:
Wenn Sie brauchen, dass die null nicht lassen, könnten Sie einen "wenn"
InformationsquelleAutor Marcus person
Wie über dieses?
Kann der Benutzer dann Durchlaufen Sie die
Set
mit einer for-Schleife.InformationsquelleAutor Jitin Kodian
In Java 8, wenn Sie möchten, um eine
list
nicht wiederholenN
zufällige Ganzzahlen inrange (a, b)
, wob
ist exklusiv, Sie können so etwas wie dies:Tatsächlich, die Wahrscheinlichkeit zu finden, die richtige Zufallszahl, die bei jeder iteration ist gegeben durch (N-n+1)/N in der Vaibhav Jain-Implementierung. Wo N ist der insgesamt geforderte Anzahl von Zufallszahlen und n ist die Nummer der aktuellen iteration. Die erwartete Anzahl der Iterationen ist dann gegeben durch
O(N log(N))
, die im Durchschnitt weniger als 500500. Siehe en.wikipedia.org/wiki/Coupon_collector%27s_problemHey, das ist interessant. danke!
InformationsquelleAutor Slawomir Domagala
InformationsquelleAutor jayanthanantharapu
InformationsquelleAutor Vaibhav Jain