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

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.

[CODE lang="java" highlight="86-89"]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 = tippzwischenspeicher;

boolean zahldoppelt = false;

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

if (!zahldoppelt && tippzwischenspeicher >= 1 && tippzwischenspeicher <= 49) {
tipp = 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));
}
}
[/CODE]

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:

nvX12Wt.png


Ü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:

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++;
            }
 

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!
 
B

BestGoalkeeper

Gast
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 ;)
 
B

BestGoalkeeper

Gast
6 Richtige nach 41 Ziehungen ;)
Code:
558751
41
[7, 27, 29, 41, 46, 48]
[7, 27, 29, 41, 46, 48]
 

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.
 
B

BestGoalkeeper

Gast
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
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
U Lotto-Zahlen App Java Basics - Anfänger-Themen 34
A Lotto Programm Java Basics - Anfänger-Themen 3
J Lotto 6 aus 49 Java Basics - Anfänger-Themen 7
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
krgewb Keine richtige Doku Java Basics - Anfänger-Themen 5
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
M Kennt jemand die richtige Lösung? Java Basics - Anfänger-Themen 7
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
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
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
I Java Mail Timeout erst nach rund 5 Minuten? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben