Wie generiere ich in Java 10 Zufallszahlen, die sich NICHT wiederholen?

5 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Wenn du ein Array der Länge n gefüllt mit Zahlen von 0 bis n-1 haben willst, in dem jede Zahl nur einmal vorkommt und die Reihenfolge zufällig ist, dann geht das am effizientesten so:

public static List randlist(int len) {
ArrayList result = new ArrayList(len);
for (int i = 0; i < len; ++i) {
result.add(i);
}
Collections.shuffle(result);
return result;
}

Danach kannst du wie folgt über deine Zufallszahlen iterieren:

List r = randlist(10);
for (int i : r) {
System.out.println(i);
}

Meine Funktion oben hat eine Laufzeit von O(n), alle anderen Möglichkeiten - die auf Überprüfung der bisherigen Zufallszahlen beruhen - haben hingegen eine Laufzeit von O(n*n/2).

Das macht bei 100 Zufallszahlen mit meiner Methode glatt 100 Durchläufe, mit deiner Methode hingegen 5000.

Viel Spaß damit! :)


hartesBrot 
Beitragsersteller
 03.10.2015, 11:54

Ok ich werde es mal ausprobieren. Vielen Dank für die ausführliche Antwort! ;)

TeeTier  03.10.2015, 11:52

PS: Noch eine kleine Anmerkung ... Wenn du Zahlen im Bereich "min" bis "max" haben willst, der sich nicht unbedingt mit dem Bereich zwischen "0" und "len-1" überdecken oder gar schneiden muss, geht das ähnlich effizient und schnell, und ist im Grunde genommen nur ein weiterer geschachtelter Aufrauf einer leicht modifizierten randlist()-Methode.

Manchmal will man ja schließlich 6 Zufallszahlen zwischen 0 und 49 haben, die sich nicht wiederholen (zum Beispiel Lotto). In so einem Falle wäre eine Modifikation obiger Methode natürlich ratsam. :)

Sowas am besten bei www.stackoverflow.com fragen und nicht hier


TeeTier  03.10.2015, 11:44

Nein, für so etwas ist Stackoverflow NICHT gedacht!

Für Anfängerfragen ist GF schon absolut richtig. SO ist etwas für Profis, und einfache Fragen werden dort - zu Recht - relativ schnell gelöscht oder gesperrt.

hartesBrot 
Beitragsersteller
 02.10.2015, 23:15

ok ich werde mich mal umschauen. danke! ;)

Joblabab  02.10.2015, 23:16
@hartesBrot

Hätte es auch hier beantwortet wenn ichs wüsste bin aber selbst noch nicht wirklich erfahren mit java, trotzdem kein Ding 

Wie generiere ich in Java 10 Zufallszahlen, die sich NICHT wiederholen?

Das Datum ändert sich täglich. Wenn sich die Zufallszahlen nicht wiederholen sollen, kann man das aktuelle Datum nehmen. Heute ist beispielsweise der 03.10.2015 => 3102015; morgen 04.10.2015 =>4102015 … Diesen Wert kann man als „Hilfswert“ oder „Initialwert“ für den Zufallszahlengenerator verwenden.

Zufallswert = Randomwert*Initialwert*konstanterBereichswert

Der „konstanterBereichswert“ soll ein skalierender Zahlenwert sein, der die Zahlen in einen gewünschten Zahlenbereich von beispielsweise 0 … 100 o.ä. (ver)schiebt.

Da muß man eben probieren … :-)

In die For schleife die die Random zahlen generiert machste ne while schleife die solange random Zahlen generiert bis eine kommt die noch nicht im array ist. Das machste in der While schleife mit ner  weiteren For schleife die durch das Array loopt und schaut ob der wert vorhanden ist. Wenn dann der Wert eingetragen wurde Und du aus der While schleife raus bist wiederholt sich das für alle folgenden Loops der For Schleife und du hast keine doppelten Ergebnisse.


TeeTier  03.10.2015, 11:47

Diese Lösung ist auch schrecklich ineffizient. Selbst bei einer relativ kleinen Anzahl an Zufallszahlen wird dabei so unendlich viel Zeit verbraten, dass man so einen "Algorithmus" eigentlich nicht mehr in der Praxis einsetzen kann. :)

Einfach gesagt:

Du generierst eine zufällige Zahl, die du in einer Variable speicherst.

Danach vergleichst du das Array, ob die Zahl schon enthalten ist.

Wenn ja, neue Zahl generieren, erneut durchsuchen,...


Missingo1996  03.10.2015, 12:24

Ja schon, aber man lernt viel dabei und muss sich was überlegen.

TeeTier  03.10.2015, 11:45

Das ist dann aber verdammt ineffizient. Solche Lösungen sollte man nach Möglichkeit vermeiden. :)

Missingo1996  02.10.2015, 23:52

Am besten du machst ein Unterprogramm

hartesBrot 
Beitragsersteller
 02.10.2015, 23:40

ok ich probier mal ein bisschen rum. danke schonmal! ;)