Lottozahlen

werdas34

Bekanntes Mitglied
Hallo,

ich wollte zu Übungszwecken ein Programm schreiben, dass sechs Lottozahlen ausgibt, aber nie eine Zahl doppelt vorkommt.
Meine Umsetzungsidee:
- Die Lottozahlen in Array speichern
- Eine Endlosschleife erzeugt die Lottozahl, da ja mehrmals eine Zahl erzeugt werden kann Endlosschleife und wenn Array voll ist, auf false setzen
- Zweite Schleife die prüft ob eine Zahl bereits im Array steht, wenn ja, neue Zahl erzeugen, wenn nein, Zahl an nächstfreier Stelle im Array schreiben

Ich hänge bei der Zweiten Schleife, die prüfen soll ob die Zahl bekannt ist.

Code:
import java.util.Random;

public class Lotto {

   public static void main(String[] args) {

       Random rand = new Random();

       int[] arr = new int[6];
       boolean loop = true;
       int i, k = 0;
       // Lottozahlen ermitteln
       while (loop) {
           int zahl = rand.nextInt(49) + 1;
           // Prüfe ob, ermittelte Zahl schon vorkommt
           for (i = 0; i < arr.length; i++) {
               if (zahl == arr[i]) {
                   break;
               } else {
                   arr[k] = zahl;
                   k++;
                   // Sind alle 6 Zahlen gezogen, verlasse Schleife
                   if (k == 5) {
                       loop = false;
                   }
               }
           }
       }

       // Ausgabe
       int j = 0;
       for (i = 0; i < arr.length; i++) {
           ++j;
           System.out.println(j + ". Zahl:\t " + arr[i]);
       }
   }

}


Ausgabe ist zurzeit:
1. Zahl: 27
2. Zahl: 27
3. Zahl: 27
4. Zahl: 27
5. Zahl: 27
6. Zahl: 27
(27 ist die zufällig erzeugte Zahl in diesem Fall)

Kann mir wer einen Ansatz nennen, oder wie ich das am besten zu meinen Wünschen entsprechend ändere?
 

Robat

Top Contributor
Persönlich würde ich dir wohl eher zu einem Set raten (das lehnt doppelte Elemente von Haus aus ab) .. dann könntest du einfach solange Zahlen zum Set hinzufügen bis die Länge 6 ist.
Zu deinem Vorgehen vielleicht folgenden Pseudocode (nur der Teil um festzustellen ob die Zahl schon vorkommt / hinzufügen):
Code:
zahlGefunden : false
für jedes element im array
    wenn aktuelles element gleich der gewürfelten zahl
        zahlGefunden : true
wenn zahlGefunden gleich false
    füge zahl dem array hinzu
    position erhöhen
 

werdas34

Bekanntes Mitglied
Danke für deine Antwort.
Ich werd es mit Set probieren. Habe davon keine Ahnung. Bringe mir momentan selber Java bei.

Was ich davor noch eventuell probieren werde ist die Überprüfung der Zahl als Funktion auszugliedern und dann muss ich mir noch überlegen wies weiter geht. :D
 

jeracom

Mitglied
Also ich habe das jetzt so gelöst ohne Array. Allerdings taucht teils die "0" auf, die müsste man noch vermeiden.
Meintest Du sowas?

Java:
import java.util.Random;

public class Lotto {
   public static void main(String[] args) {

       Random rand = new Random();
       int count = 0;

       while (true) {
           int zahl = rand.nextInt(49);
           System.out.println(count + 1 + ". Zahl:\t " + zahl);
           if (count == 5) {
               break;
           }
           count++; // Zähler
       }
   }

}

VG jeracom
 
Zuletzt bearbeitet:

temi

Top Contributor
Ohne dir irgendwie zu merken, welche Zahl schon mal da war, wird es nicht zu machen sein. Ein Vorschlag meinerseits: Mach dir ein Boolean-Array mit der Länge 49 (bzw. 50, dann kannst du den Feldindex 0 weglassen). Immer, wenn du eine neue Zahl ermittelst prüfst du, ob der entsprechende Wert im Array bereits belegt ist, ansonsten setzt du diesen auf True. Das ganze solange, bis zu sechs Zahlen hast.
Das hat den Vorteil, dass die Kontrolle sehr natürlich daher kommt:
if (bereitsGezogen[zahl]) {
 

VfL_Freak

Top Contributor
Moin,

hier mal ein einfacher Algorithmus mit Arrays:
Java:
int[] lottozahlen = new int[6];
boolean[] gezogeneKugeln = new boolean[49];
int zufallszahl = 0;
      
for( int i = 0; i < lottozahlen.length; i ++ )
{
    if( i == 0 )
    {
         zufallszahl = (int)(Math.random()*49+1 );
         lottozahlen[0] = zufallszahl;
         gezogeneKugeln[zufallszahl-1] = true;
    }
    zufallszahl = (int)(Math.random()*49+1 );
       
    while( gezogeneKugeln[zufallszahl-1] )
    {
        zufallszahl = (int)(Math.random()*49+1 );
    }
    gezogeneKugeln[zufallszahl-1] = true;
    lottozahlen[i] = zufallszahl;
}

for( int i = 0; i <= 5; i++ )
{
    System.out.println("Lottozahl [" + (i+1) + "] ist: <" + lottozahlen[i] + ">");
}

Gruß Klaus
 

Baelact

Mitglied
Lieber Werdas34,
Set (also z.B.
Java:
java.util.HashSet
) wäre wirklich mehr elegant.
Deine originelle Lösung hat aber das problem, dass
Code:
int zahl
nur einmal kalkuliert ist:
- zum ersten Mal wird es kalkuliert. Z.B. bekommst du zahl=27
- dann vergleichst du zahl mit arr erst für i=0
- aber da arr noch leer ist, wird der else-Zweig gewählt, wobei:
Java:
    arr[0] := 27; k++;
    arr[1] := 27; k++;
    arr[2] := 27; k++;
u.s.w. bis k==5 wird erreicht, wobei du aus der Schleife herausspringst.
 

Javinner

Top Contributor
@werdas34
#7, #8 würde ich mir genau anschauen, auch wenn ich hier anders vorgehe.
Ich überprüfe in einer Methode, ob das Array, welches ich mit Zahlen fülle, bereits die Zahl enthält und wenn ja,
wird solange gezogen, bis dies nicht mehr zutrifft.

Desweiteren, wenn ich an Lotto denke, gibt es mehrere Variationen des Spiels, so halte ich es für sinnvoll hier ein Enum ins Leben zu rufen, um die Informationen, welches ein Enum zur jeweiligen Spielvariante enthält, an die Methoden zu übergeben.

Java:
public class Lotto
{

    public static void main(String[] args)
    {
        Ziehung a = new Ziehung();
        int[][] ziehungAmFreitag = a.lottoZiehung(Variationen.EUROJACKPOT);
    }

/** Konsolenausgabe */
6, 8 //Superzahl
8, 12, 14, 18, 41 //Spielzahlen
}

Java:
public class Lotto
{

    public static void main(String[] args)
    {
        Ziehung a = new Ziehung();
        int[][] ziehungAmMittwoch= a.lottoZiehung(Variationen.SECHS_AUS_NEUNUNDVIERZIG);
    }

/** Konsolenausgabe */
9 //Superzahl
6, 12, 17, 30, 41, 43 //Spielzahlen
}

Hier ein wirklich guter Artikel zum Thema Enum.
 

temi

Top Contributor
Egal welche Lösung du umsetzt, wähle dir einen Weg, den du auch verstehst und der deinem aktuellen Wissensstand entspricht. Dennoch solltest du jetzt auch wissen, das Java auch Datenstrukturen bietet (z.B. Set), die diese Aufgabe erleichtern und diese später auch gezielt einsetzen.

Edit: Ansonsten kann ich dir nur raten: Probiere aus! Nutze den Debugger und gehe dein Programm schrittweise durch, um zu verstehen, was gerade falsch läuft. Das Abtippen von "fertigen" Lösungen bringt i.d.R. nicht sehr viel Wissensgewinn.
 

werdas34

Bekanntes Mitglied
Ohne dir irgendwie zu merken, welche Zahl schon mal da war, wird es nicht zu machen sein. Ein Vorschlag meinerseits: Mach dir ein Boolean-Array mit der Länge 49 (bzw. 50, dann kannst du den Feldindex 0 weglassen). Immer, wenn du eine neue Zahl ermittelst prüfst du, ob der entsprechende Wert im Array bereits belegt ist, ansonsten setzt du diesen auf True. Das ganze solange, bis zu sechs Zahlen hast.
Das hat den Vorteil, dass die Kontrolle sehr natürlich daher kommt:
if (bereitsGezogen[zahl]) {

Ich habe es ohne großes Array gelöst, da ich nicht für jede Kugel einen Arrayplatz belegen wollte. Deine Lösung ist dafür umso sinnvoller, wenn es z.B. um 25 aus 49 geht, da dann die Laufzeit, meiner Lösung, zu sehr ansteigt.

Lieber Werdas34,
Set (also z.B.
Java:
java.util.HashSet
) wäre wirklich mehr elegant.
Wie gesagt, ich bringe mir Java grad selber bei, habe davor C gelernt und wollte was Objektorientiertes lernen. Sobald ich mein letztes Thema (Datei beschreiben/lesen) durch habe werde ich mich durch die Bibliotheken lesen.

Desweiteren, wenn ich an Lotto denke, gibt es mehrere Variationen des Spiels, so halte ich es für sinnvoll hier ein Enum ins Leben zu rufen, um die Informationen, welches ein Enum zur jeweiligen Spielvariante enthält, an die Methoden zu übergeben.

Eins sehr nette Idee, jedoch habe ich null Ahnung von den restlichen Lottospielchen. Ich muss zugeben, ich hätte es erwähnen müssen, dass es nur um 6 aus 49 geht.

Egal welche Lösung du umsetzt, wähle dir einen Weg, den du auch verstehst und der deinem aktuellen Wissensstand entspricht. Dennoch solltest du jetzt auch wissen, das Java auch Datenstrukturen bietet (z.B. Set), die diese Aufgabe erleichtern und diese später auch gezielt einsetzen.

Edit: Ansonsten kann ich dir nur raten: Probiere aus! Nutze den Debugger und gehe dein Programm schrittweise durch, um zu verstehen, was gerade falsch läuft. Das Abtippen von "fertigen" Lösungen bringt i.d.R. nicht sehr viel Wissensgewinn.

Vielen Dank. Ja, das weiß ich jetzt. Werde mich damit bald auseinandersetzen. Und ich habe eine Lösung kreiert, die ohne Set und großes Array auskommt:
Code:
import java.util.Random;

public class Lotto {

   static boolean isDouble(int[] array, int number) {
       int i;
       for (i = 0; i < array.length; i++) {
           if (number == array[i]) {
               return false;
           }
       }
       return true;
   }

   public static void main(String[] args) {

       Random rand = new Random();

       int[] arr = new int[6];
       boolean loop = true;
       int i, k = 0;
       // Lottozahlen ermitteln
       while (loop) {
           int zahl = rand.nextInt(49) + 1;
           // Prüfe ob, ermittelte Zahl schon vorkommt
           if (isDouble(arr, zahl) == true) {
               arr[k] = zahl;
               k++;
               // Sind alle 6 Zahlen gezogen, verlasse Schleife
               if (k == 6) {
                   loop = false;
               }
           }
       }

       // Ausgabe
       int j = 0;
       for (i = 0; i < arr.length; i++) {
           ++j;
           System.out.println(j + ". Zahl:\t " + arr[i]);
       }
   }

}
 

temi

Top Contributor
Der Name der Funktion ist ganz schlecht gewählt. Als Benutzer erwarte ich von einer Funktion mit diesem Namen, dass sie TRUE zurück gibt, wenn die Nummer bereits vorhanden ist. In Wirklichkeit liefert deine Funktion aber genau das Gegenteil und sollte demnach eher "isUnique" heißen.

Noch ein paar Kleinigkeiten:
Auf die Variable "loop" kannst du gut verzichten, wenn du die passende Bedingung (k < 6) gleich als Bedingung für die While-Schleife verwendest.

if (isDouble(arr, zahl) == true) { wird verkürzt zu if (isDouble(arr, zahl)) {
Die IF-Bedingung erwartet in der Klammer einen Boolean. Das Ergebnis von "isDouble" ist bereits ein boolean, so dass du auf den Vergleich verzichten kannst.
 

shweta

Neues Mitglied
hey for lottery number generation you can use some java predefined methods and classes like
java.util.Random, (class)
Math.Random(), Method
ThreadLocalRandom, (class)

In order to generate random no. you just have to create the instance of class then invoke the methods.
 

Ähnliche Java Themen

Neue Themen


Oben