Java Lottozahlen ziehen?
Lotto spielen 1 bis 49 6 Zahlen in int Array speichern
Zahlen dürfen nicht doppelt vorkommen.
Wie erreiche ich das?
D. h. 1 Zahl z. B. 6
2 Zahl 15
3 Zahl 25
Jetzt muss die 3 Zahl mit der 1 und 2 abgeglichen werden. Ist die 3 Zahl genauso wie die 1 z. B. so muss die 3 Zahl nochmal gezogen werden. Dann Vergleich 3 Zahl mit 2 Zahl. Sind diese gleich dritte Zahl muss nochmal gezogen werden
Mein Ansatz bislang:
int[] ziehung = new int[6];
for (int i = 1; i <= ziehung.length; i++)
{
ziehung[i-1] = (int) (Math.random()*49 + 1); // Zufallszahlen 1 bis 49
for (int j = 0; j < i;j++)
{
if (ziehung[i-1]==ziehung[j])
ziehung[i] = (int) (Math.random()*49 + 1);
}
Es werden zuviele Zahlen gezogen. Wo ist mein Fehler?
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:
- Zufallszahl = <Zufällige Zahl zwischen 1 und 49>
- SOLANGE Zufallszahl bereits im Array vorkommt, generiere neue Zufallszahl
- 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.
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:
- Wirf alle 49 Zahlen in einen Topf
- Mische die Zahlen zufällig durch
- 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.
Gerade fiel mir ein dritter Lösungsweg ein, der noch viel besser ist!
- Erstelle ein Set (Sets haben die Eigenschaft, dass sie nur unterschiedliche Werte beinhalten können. In einem Set gibt es keine Duplikate.)
- 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));
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
Danke für deine Tipps und Ratschläge. Des wird immer komplizierter langsam.