Java Lottozahlen ziehen?


20.11.2022, 21:43

In meinem Code mit den Schleifen ist auch ein Fehler.

2 Antworten

ziehung[i-1] = (int) (Math.random()*49 + 1);

muss es in der if-Abfrage heißen.

Aber auch dann können noch Duplikate vorkommen, denn es kann ja sein, dass die Zahl wieder durch die selbe unerlaubte Zahl ersetzt wird.

Machs so:

  1. Zufallszahl = <Zufällige Zahl zwischen 1 und 49>
  2. SOLANGE Zufallszahl bereits im Array vorkommt, generiere neue Zufallszahl
  3. array[i-1] = Zufallszahl

Das ganze natürlich 6 mal, deine äußere Schleife kannst du also lassen.

Kriegst du das hin?
Das mit dem "Solange" hast du noch nicht, deswegen kanns bei dir eben weiterhin Duplikate geben. Für "Solange die Zufallszahl schon vorkommt" brauchst du eine while-Schleife. Im diesen Fall am besten eine do-while-Schleife, dann musst du den Code für das Erstellen der Zufallszahl nur einmal schreiben, und dahinter dann die Bedingung (Zufallszahl bereits vorhanden), unter der das Erstellen wiederholt wird.

Du kannst bei deinem jetzigen Code um die innere for-Schleife noch eine while-Schleife ergänzen, und in der For-Schleife dann ein entsprechendes boolean-Flag setzen, das angibt, ob die Zahl bereits im Array vorkam. Dieses dient dann für die While-Schleife als Abbruchbedingung.

Woher ich das weiß:Studium / Ausbildung – Bachelor in Informatik 👨🏻‍🎓
RedDevil1982 
Fragesteller
 20.11.2022, 22:43

Danke für deine Tipps und Ratschläge. Des wird immer komplizierter langsam.

1
MrAmazing2  20.11.2022, 23:11
@RedDevil1982

Gerne ^^

Jo, ganz so einfach ist das nicht mehr. Aber braucht man öfter mal, daher weiß ich die Lösung schon auswendig.

Gibt auch einen zweiten Lösungsweg:

  1. Wirf alle 49 Zahlen in einen Topf
  2. Mische die Zahlen zufällig durch
  3. Nimm die ersten 6 raus

Mit ein paar in Java eingebauten Funktionen ist es ziemlich kurz und auch einfach zu lesen. Nur man muss halt ein bisschen googlen um das Zeug zu finden. Habe dafür folgendes gegoogelt:
1. "Java List of Integers 1 to n"
2. "Java shuffle list"
3. "Java sublist"

Damit komme ich auf diese Lösung:

List<Integer> allNumbers = Stream.iterate(1, n->n+1).limit(49).collect(Collectors.toList());
Collections.shuffle(allNumbers);
List<Integer> lottoNumbers = allNumbers.subList(0, 6);

Das sollte dir eine Liste mit sechs Zahlen zwischen 1 und 49 ohne Duplikate generieren.

0
MrAmazing2  20.11.2022, 23:46
@RedDevil1982

Gerade fiel mir ein dritter Lösungsweg ein, der noch viel besser ist!

  1. Erstelle ein Set (Sets haben die Eigenschaft, dass sie nur unterschiedliche Werte beinhalten können. In einem Set gibt es keine Duplikate.)
  2. Füge zu diesem Set solange eine Zufallszahl hinzu, bis sechs Zufallszahlen (die dann natürlich alle unterschiedlich sind) vorhanden sind.

Ein Zwei-Zeiler, ich denke besser geht's nicht!

HashSet<Integer> lottoNumbers = new HashSet<>();
while (lottoNumbers.size() < 6) lottoNumbers.add((int) (Math.random()*49 + 1));
0

Ich würde das mit Streams machen. Die Random-Klasse hat schon die ints()-Funktion, mit der du einen Stream aus Zufallszahlen erzeugen kannst.

int[] ziehung = new Random()    // erzeuge Zufallszahlen
                .ints(1, 50)    // zwischen 1 und 49
                .distinct()     // ohne Duplikate
                .limit(6)       // 6 Stück
                .toArray();     // und pack sie in ein Array