Zufallszahl ohne Wiederholung

  • Themenstarter Themenstarter Fragensteller1
  • Beginndatum Beginndatum
F

Fragensteller1

Gast
Hallo zusammen

Ich fange gerade an und probiere mich an Zufallszahlen, bei denen keine Zahl doppelt vorkommen darf.
Kann mir jemand bestätigen, ob das so funktioniert? Hab einen "Pulttest" gemacht, also auf Papier und bin der Meinung, dass nun keine doppelte Zahlen mehr vorkommen können.

Bei getrandom kommen ZAHLENvon 1-20 und die Anzahl beträgt 6

Java:
//Zufallszahl ziehen
    	for (i=0;i<ANZAHL;i++){
			
			x=getrandom(ZAHLEN);
				
			//Doppelte Werte abfangen
			for(j=0;j<ANZAHL;j++){
				do{
					for (k=0;k<ANZAHL;k++){
						
						while(x==zufallszahl[k]){
							x=getrandom(ZAHLEN);
						}
						
					}
				}while(x==zufallszahl[j]);
			}
			
			//Zufallszahl in Array hinzufuegen, falls nicht doppelt
			Zufallszahl[i]=x;
		}

Vielen Dank im Voraus
 
Wie wär´s mit ausprobieren? Warum soll man über ein Programm schauen, ob es funktioniert, wenn es nichtmal getestet wurde?
Zweitens: vier ineiander geschachtelte Schleifen seheh mir persönlich sehr suspekt aus. Da solltest du u.U. nochmal drüber nachdenken.
Willst du doppelte Einträge verhindern, würde ich dir sowieso zu einer HasMap raten, wenn´s aber unbedingt ein Array sein soll, schreib dir wenigstens eine Funktion, die überprüft, ob in deinem Array bereits das Element enthalten ist, welches du versuchst hinzuzufügen.
 
Zuletzt bearbeitet:
Das ist ziemlich abgefahren um auf die schnelle zu sagen ob es funktioniert oder nicht. Da lässt sich bestimmt ein Beispiel konstruieren, wo es nicht hinhaut im letzten j und k wert wird eine Zufallszahl generiert, die bereits zuvor auftaucht.
Mach es doch viel einfacher:
Java:
for (i=0;i<ANZAHL;i++){
  do {
    x=getrandom(ZAHLEN);
  } while (isDuplicateExist(zufallszahl, i, x));
  zufallszahl[i] = x;
....
boolean isDuplicateExist(int[] zufallszahl, int index, int x) {
  for (int i=0;i<=index;i++) {
  }
  //gibt true zurück, falls x bereits auftaucht, ansonsten gib false zurück
}


Oder packe einfach deine Zahlen von 1 bis 20 in ein Array, mische es und gib die ersten 6 aus.

@HimBromBeere: was willst du da ausprobieren? Ein mal das Ding starten und dann sagen: "Ja, das ist korrekt und gilt für alle Fälle, weil ein zufälliges Beispiel gerade geklappt hat"?
 
Danke für die schnelle Antwort

Ich habe das Programm natürlich schon getestet.
Aber wie oft ist es der Fall, dass man einen Fall übersieht..

Die vielen Schleifen kommen sicherlich auch daher, dass ich noch ein Anfänger bin,
denke aber, dass sich das noch verbessern wird.
Doch die Schleifen sind doch notwendig? Wenn eine Zahl schon im Array vorhanden ist
wird eine neue Zahl gezogen dann geht man aus der Schleife nun ist i+1 an der Reihe, so nun
ist diese Zahl auch vorhanden, eine neue wird gezogen, diese entspricht wieder i...
Das muss verhindert werden durch die do while in der for-schleife

soweit richtig oder?
 
Wenn du wissen willst ob die Methode funktioniert, dann teste sie. Entweder per Hand, oder mit nem UnitTest.

Das ganze lässt sich aber auch wesentlich einfacher implementieren 😉

Java:
public static List<Integer> getRandomNumbers(int max, int count) {
	List<Integer> numbers = new ArrayList<Integer>();

	for (int i = 1; i <= max; i++) {
		numbers.add(i);
	}
	
	Collections.shuffle(numbers);
	
	return numbers.subList(0, count);
}
 
Evtl. könntest du auch für die äußere Schleife ein while verwenden, welches solange läuft, wie ein gewissen der Zähler i kleiner als 6 ist. Diesen Zähler zählst du aber nicht mit JEDEM Durchlauf hoch (wie in einer for-Schleife üblich), sondern nur im Erfolgsfall, d.h. dass das i-te Element noch nicht enthalten ist.
 
Danke an alle für die Antworten

Ich denke XHelp's Antwort versteh ich am besten und mir
leuchtet auch ein, dass es so funktionieren sollte...
Sehe ich es richtig, dass die Schleife nun einfach ausgelagert wurde?
 
Nehme eine Liste mit Zahlen und mische sie,
nehme eine Liste mit Zahlen (LinkedList) und entnehme Zahlen an einer zufälliger Position,
nehme ein Array und prüfe bei jeder Generierung, ob die neue Zahl noch nicht enthalten ist,
nehme ein HashSet (SET wohl bemerkt) und prüfe wieder, ob die neue Zahl noch nicht enthalten ist.

Ein paar möglichkeiten, die mir auf die schnelle eingefallen sind.
 

Zurück
Oben