Lotto 3, 4, 5, 6 Richtige nach x Ziehungen ermittelt..

C

cookiedough

Mitglied
Hallo zusammen,

Ich habe ein kleines Programm in Java geschrieben, das herausfindet, nach wie vielen Verlosungen 6 richtige Zahlen gezogen wurden und wie oft dabei 3, 4 und 5 richtige Zahlen gezogen wurden.

Java:
import java.util.Arrays;
import java.util.Scanner;

public class Lottoziehung {

    // Lotto spielen

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);


        // Lotto von x aus X
        // Tipp erstellen per Eingabe

        int tipp[] = new int[6];
        int i = 0;
        do {
            System.out.println("Wie ist dein " + (i + 1) + " .Tipp?");
            int tippzwischenspeicher = scan.nextInt();
            tipp[i] = tippzwischenspeicher;

            boolean zahldoppelt = false;

            for (int j = 0; j < i; j++) {
                if (tippzwischenspeicher == tipp[j]) {
                    zahldoppelt = true;
                }
            }

            if (!zahldoppelt && tippzwischenspeicher >= 1 && tippzwischenspeicher <= 49) {
                tipp[i] = tippzwischenspeicher;
                i++;
            }
        } while (i < 6);

        System.out.println("hier sind deine tipps:");
        Arrays.sort(tipp);

        for (int k = 0; k < tipp.length; k++) {
            System.out.println(tipp[k]);
        }


        // Lotto 49 Zahlen erzeugen
        int aus49[] = new int[49];
        for (int l = 0; l < aus49.length; l++) {
            aus49[l] = l + 1;
            l++;
        }

        // 3 Tipps, 4 Tipps, 5 Tipps
        int einsKorrekte = 0;
        int zweiKorrekte = 0;
        int dreiKorrekte = 0;
        int vierKorrekte = 0;
        int funfKorrekte = 0;
        int sechsKorrekte = 0;
        int haha = 0;


// Schleife für Ziehung
        int ziehung[] = new int[6];
        int counter = 0;
        do {

            // Ziehung
            for (int m = 0; m < ziehung.length; m++) {
                int r = (m + (int) ((Math.random() * aus49.length) - m));
                ziehung[m] = r;

                boolean randomzahldoppelt = false;

                for (int n = 0; n < m; n++) {
                    if (r == ziehung[n]) {
                        randomzahldoppelt = true;
                        m--;
// Ansatz überprüfen, evtl falsch
                    }
                }
            }

            Arrays.sort(ziehung);

            int anzahlRichtige = 0;
            for (int o = 0; o < tipp.length; o++) {
                for (int p = 0; p < tipp.length; p++) {
                    if (tipp[o] == ziehung[p]) {
                        anzahlRichtige++;
                    }
                }
            }

            switch (anzahlRichtige) {
                case 1:
                    einsKorrekte++;
                    break;
                case 2:
                    zweiKorrekte++;
                    break;
                case 3:
                    dreiKorrekte++;
                    break;
                case 4:
                    vierKorrekte++;
                    break;
                case 5:
                    funfKorrekte++;
                    break;
                case 6:
                    sechsKorrekte++;
                    break;
                default:
                    haha++;
            }

            counter++;

            if (Arrays.equals(tipp, ziehung)) {
                System.out.println("einsKorrekte gab es " + einsKorrekte + " !");
                System.out.println("zweiKorrekte gab es " + zweiKorrekte + " !");
                System.out.println("dreiKorrekte gab es " + dreiKorrekte + " !");
                System.out.println("vierKorrekte gab es " + vierKorrekte + " !");
                System.out.println("funfKorrekte gab es " + funfKorrekte + " !");
                System.out.println("sechsKorrekte gab es " + sechsKorrekte + " !");
                System.out.println("Sechs Richtige gab es " + counter + " Ziehungen!");
            }

        } while (!Arrays.equals(tipp, ziehung));
    }
}

Nach vielen Durchläufen bemerkte ich einen Fehler in der Ausgabe. Das Programm stellte fest, dass nach 1.502 Ziehungen 6 richtige Zahlen gezogen wurden, nicht jedoch 5 richtige Zahlen. Hier ist der Screenshot:



Übersetzt bedeutet das:
Sechs Richtige gab es nach 1502 Ziehungen!
dabei gab es:
- 686x ein Richtige
- 242x zwei Richtige
- 44x drei Richtige
- 3x vier Richtige
- 0x fünf Richtige

- 1x sechs Richtige

Der Fehler ist schwer zu reproduzieren, normalerweise werden nach 3,5 Millionen Ziehungen 6 richtige Zahlen ausgewählt.

Es war ein Zufall, dass ich bereits nach 1.502 Ziehungen 6 richtige Zahlen bekam. Nur so bemerkte ich den Fehler, dass keine fünf richtigen Zahlen ausgewählt wurden.


Ich vermute, der Fehler liegt in den Zeilen 86-89. Weiß jemand wo der Fehler versteckt ist?
 
Zuletzt bearbeitet:
L

LimDul

Top Contributor
Ursache ist simpel, all deine Zahlen bis auf die 6 richtigen sind falsch.

Du zählst die Anzahl der richtigen pro Ziehung. Wenn es zwei Richtige gab, gibt es auch immer einen richtigen. Aber die Variable anzahlRichtige enthält halt eine 2 daher wird auch nur zweiKorrekte hochgezählt. Das Case Statement müsste (mit FallThrough) so aussehen:

Java:
            switch (anzahlRichtige) {
                case 6:
                    sechsKorrekte++;
                case 5:
                    funfKorrekte++;
                case 4:
                    vierKorrekte++;
                case 3:
                    dreiKorrekte++;
                case 2:
                    zweiKorrekte++;
                case 1:
                    einsKorrekte++;
                    break;
                default:
                    haha++;
            }
 
F

fhoffmann

Top Contributor
Ergänzend zu dem, was LimDul geschrieben hat: Meinst du mit "3 Richtige" eigentlich "genau 3 Richtige" oder "mindestens 3 Richtige".

Außerdem ist folgender Code falsch:
Java:
        for (int l = 0; l < aus49.length; l++) {
            aus49[l] = l + 1;
            l++;
        }
Du rufst hier zweimal l++ auf!
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
6 Richtige nach nur 651 Ziehungen ;)
Java:
    public static int[] pull_6_out_of_49_sorted(Random r) {
        TreeSet<Integer> tsi = new TreeSet<>();
        while (tsi.size() < 6)
            tsi.add(r.nextInt(49) + 1);
        return tsi.stream().mapToInt(Integer::intValue).toArray();
    }

    public static void main(String[] args) {
        int i = 6608;
        Random r = new Random(i);
        int[] a = pull_6_out_of_49_sorted(r);
        for (int j = 0; j < 1000; j++) {
            int[] b = pull_6_out_of_49_sorted(r);
            if (Arrays.equals(a, b)) {
                System.out.println(i);
                System.out.println(j);
                System.out.println(Arrays.toString(a));
                System.out.println(Arrays.toString(b));
                return;
            }
        }
    }
Und weiter hab ich noch gar nicht gesucht ;)
 
C

cookiedough

Mitglied
Ursache ist simpel, all deine Zahlen bis auf die 6 richtigen sind falsch.

Du zählst die Anzahl der richtigen pro Ziehung. Wenn es zwei Richtige gab, gibt es auch immer einen richtigen. Aber die Variable anzahlRichtige enthält halt eine 2 daher wird auch nur zweiKorrekte hochgezählt. Das Case Statement müsste (mit FallThrough) so aussehen:

Java:
            switch (anzahlRichtige) {
                case 6:
                    sechsKorrekte++;
                case 5:
                    funfKorrekte++;
                case 4:
                    vierKorrekte++;
                case 3:
                    dreiKorrekte++;
                case 2:
                    zweiKorrekte++;
                case 1:
                    einsKorrekte++;
                    break;
                default:
                    haha++;
            }

Ich verstehe: Wenn zufällig bei der ersten Ziehung bereits 6 Richtige gezogen werden, dann wären es jeweils auch ein 5 Richtige und 4, 3, 2, 1 Richtige geben. Und das wird erreicht mit der Switch-Anweisung ohne break.
 
BestGoalkeeper

BestGoalkeeper

Top Contributor
Nochmal, das kommt darauf an, wie du zählst... Ob es genau x richtige gibt oder ob es mindestens x richtige gibt...
Java:
    public static TreeSet<Integer> pull_6_out_of_49_sorted(Random r) {
        TreeSet<Integer> tsi = new TreeSet<>();
        while (tsi.size() < 6)
            tsi.add(r.nextInt(49) + 1);
        return tsi;
    }

    public static int count_hits(TreeSet<Integer> a, TreeSet<Integer> b) {
        return (int) a.stream().filter(i -> b.contains(i)).count();
    }

    public static List<Integer> sum_hits(TreeSet<Integer> a, TreeSet<Integer> b) {
        int h = count_hits(a, b);
        return IntStream.rangeClosed(1, 6).boxed().collect(Collectors.groupingBy(i -> i <= h ? true : false))
                .getOrDefault(true, new LinkedList<>());
    }

    public static void main(String[] args) {
        Random r = new Random(0);
        TreeSet<Integer> a = pull_6_out_of_49_sorted(r);
        for (int j = 0; j < 1_000; j++) {
            TreeSet<Integer> b = pull_6_out_of_49_sorted(r);
            List<Integer> sum_hits = sum_hits(a, b);
            if (sum_hits.size() >= 3) {
                System.out.println(j + " " + a + " " + b + " " + sum_hits);
            }
        }
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Lotto Zahlen in Array speichern Java Basics - Anfänger-Themen 2
Z Lotto-Programm Wieso klappt das? Java Basics - Anfänger-Themen 8
K Methoden Lotto mit sechs richtigen Java Basics - Anfänger-Themen 10
Z Lotto mit Arrays schreiben Java Basics - Anfänger-Themen 4
X Lotto Zahlen Ziehung Java Basics - Anfänger-Themen 26
M Lotto Programm Java Basics - Anfänger-Themen 18
H Methoden Lotto-Programm, Methoden ordnen & umbennen Java Basics - Anfänger-Themen 4
C Lotto Spiel Java Basics - Anfänger-Themen 23
2 Lotto-Spiel Java Basics - Anfänger-Themen 9
1 Ein weiteres Lotto programm Java Basics - Anfänger-Themen 6
R Lotto Zahlen Java Basics - Anfänger-Themen 4
B Lotto mittels TreeSet Java Basics - Anfänger-Themen 3
N Lotto Spiel Java Basics - Anfänger-Themen 12
P Lotto Spiel Java Basics - Anfänger-Themen 50
L Lotto 6 aus 49 Java Basics - Anfänger-Themen 11
P Zufallszahlen fuer Lotto generieren Java Basics - Anfänger-Themen 28
K Fehler in Lotto Programm Java Basics - Anfänger-Themen 8
G Lotto Zufallszahlen zählen Java Basics - Anfänger-Themen 3
G Zufalls Lotto Zahlen Ausgeben Java Basics - Anfänger-Themen 16
A Lotto Zahlen Ausgeben Java Basics - Anfänger-Themen 2
X Lotto Zufallszahlen mit ArrayList erstellen Java Basics - Anfänger-Themen 3
V Doppelte Zahlen bei Lotto verhindern Java Basics - Anfänger-Themen 11
D Richtige Kommentierung Klassenvariablen Java Basics - Anfänger-Themen 19
G Die richtige Methode aus einer DTO auszurufen Java Basics - Anfänger-Themen 27
E Die richtige Suche in der API Java Basics - Anfänger-Themen 1
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
L Collections Ist eine Arraylist hier das richtige? Java Basics - Anfänger-Themen 12
E Mastermind programmieren, wie den falschen Platz aber richtige Farbe schecken? Java Basics - Anfänger-Themen 23
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
I Richtige Java-Version finden? Java Basics - Anfänger-Themen 17
Meeresgott Richtige Dokumentation Java Basics - Anfänger-Themen 1
Meeresgott Richtige Dokumentation Java Basics - Anfänger-Themen 22
P Klassen Richtige Anwendung einer Enum-Klasse Java Basics - Anfänger-Themen 11
H Ist Java überhaupt die richtige Sprache für das Projekt? Java Basics - Anfänger-Themen 8
G Lambda Ausdruck: Welche Methode ist die Richtige? Java Basics - Anfänger-Themen 1
A richtige Kombination aus Werte- und Referenztypen Java Basics - Anfänger-Themen 63
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
E Richtige Ausgabe nur mit toString() - Warum? Java Basics - Anfänger-Themen 4
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
K Welche Java Version ist die richtige Java Basics - Anfänger-Themen 3
X Methoden Wort aus String löschen und richtige Verschachtelung Java Basics - Anfänger-Themen 17
X Ist Java für mich das richtige? Java Basics - Anfänger-Themen 10
D Simulation von Geburt/Tod und "richtige" Erkennung eines Hindernisses Java Basics - Anfänger-Themen 7
F In ArrayList wird nicht der richtige Wert gespeichert Java Basics - Anfänger-Themen 6
S Richtige String-Variable finden Java Basics - Anfänger-Themen 3
K Richtige Pfadangabe einer Textdatei Java Basics - Anfänger-Themen 7
P Ist Java die richtige Programmiersprache dafür? Java Basics - Anfänger-Themen 29
Dit_ invokeLater | richtige Anwendung Java Basics - Anfänger-Themen 2
L eine richtige anfänger-frage Java Basics - Anfänger-Themen 3
J FileOutputStream richtige Pfadangabe? Java Basics - Anfänger-Themen 8
D Der richtige Layout Manager Java Basics - Anfänger-Themen 8
P Keine richtige Codeabarbeitung?! Java Basics - Anfänger-Themen 9
U Richtige Benutzung der API-Doku Java Basics - Anfänger-Themen 8
G Richtige Syntax für Bruch Java Basics - Anfänger-Themen 12
N Anfängerfrage richtige Syntax und Frage zu Vector Java Basics - Anfänger-Themen 7
G Polymorphismus und die richtige Anwendung Java Basics - Anfänger-Themen 6
B Ist Java das richtige für mich? Java Basics - Anfänger-Themen 12
W Java das richtige? Java Basics - Anfänger-Themen 9
L JTabbedPane, richtige Übergabe von Tabs Java Basics - Anfänger-Themen 18
M Welche Javaversion ist die Richtige? Java Basics - Anfänger-Themen 14
S Java Games Programieren. Der richtige Weg dorthin. Java Basics - Anfänger-Themen 4
M Java die richtige Sprache? Java Basics - Anfänger-Themen 4
S Web Mining - XML Filter der richtige Anstatz? Java Basics - Anfänger-Themen 2
W Java Web Start das richtige? Java Basics - Anfänger-Themen 11
J Richtige Auagabe in einer *.txt Java Basics - Anfänger-Themen 2
B Ist Java das richtige für folgendes Programm! Java Basics - Anfänger-Themen 2
T Bild drehen + richtige größe berechnen Java Basics - Anfänger-Themen 4
M Richtige Paarungen aus Array ausgeben Java Basics - Anfänger-Themen 2
S richtige antworten [%] ausgabe Java Basics - Anfänger-Themen 7
bernd Richtige Pfadangabe für das Kopieren von Dateien Java Basics - Anfänger-Themen 10
A Java wirklich das richtige? Java Basics - Anfänger-Themen 20
B Paar richtige Anfängerfragen Java Basics - Anfänger-Themen 7
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
M Anzahl Schleifendurchgänge nach x Sekunden anzeigen Java Basics - Anfänger-Themen 2
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
R JDK installieren Durcheinander nach installation von SE 14.02 Java Basics - Anfänger-Themen 6
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
B DateTimeFormatter nach LocalDateTime, wenn dd.MM.yyyy oder dd.MM.yyyy mm:hh Java Basics - Anfänger-Themen 5
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
S Wohin kommt das „abstract“? Vor oder nach „public“/ „private“ /... Java Basics - Anfänger-Themen 3
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
B Umstieg von C# nach Java Java Basics - Anfänger-Themen 18
Ellachen55 Wie nach häufigste Werte im Array suchen? Java Basics - Anfänger-Themen 2
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
N Wörter und Zahlen nach speziellen Wörtern ausgeben Java Basics - Anfänger-Themen 11
M Werte ändern sich nicht mehr nach Reset Java Basics - Anfänger-Themen 14
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
B String nach erstem Leerzeichen trennen Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
UnknownInnocent Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
O zwei Arrays nach Werten durchsuchen und zusammenfügen Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
C Erste Schritte Bilder nach Export anzeigen Java Basics - Anfänger-Themen 0
F Input/Output Files von A nach B kopieren Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Anzeige

Neue Themen


Oben