Wie generiere ich in Java 10 Zufallszahlen, die sich NICHT wiederholen?
Guten Abend :) ,
ich bin gerade dabei, ein Programm in Java zu schreiben, dass mir 10 Zufallszahlen ausgeben soll, ohne Wiederholungen.
Hier erstmal mein Quellcode:
int a, b; // Hilfsvariablen
int array [] = new int [10];
for (a=0;a<10;a++) { // Zufallszahlen generieren
array [a] = (int) (Math.random()*10)+1;
if (a==1) {
if (array [a]==array[a-1]) {
array[a]=(int) (Math.random()*10)+1;
}
}
}
for (b=0;b<10;b++) { // Zufallszahlen ausgeben
System.out.print(array [b]+" ");
}
}
Dazu habe ich erstmal ein Array deklariert mit dem Index von 10. Nun habe ich eine for-Schleife erstellt, wo ich das Array mit 10 Zufallszahlen belege. Nanach prüfe ich noch in der selben Schleife, ob der nächste Wert des Arrays mit dem Letzten übereinstimmt. Falls dies zutrifft, soll das Programm die wiederholte Zahl im Array überschreiben, aber das scheint bei mir nicht zu klappen, da er mir trotzdem wiederhole Zahlen ausgibt.
Hättet Ihr da eventuell eine Idee? grübel grübel
5 Antworten
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! :)
Ok ich werde es mal ausprobieren. Vielen Dank für die ausführliche Antwort! ;)
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
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.
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.
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,...
Das ist dann aber verdammt ineffizient. Solche Lösungen sollte man nach Möglichkeit vermeiden. :)
ok ich probier mal ein bisschen rum. danke schonmal! ;)
ok ich werde mich mal umschauen. danke! ;)