Mysteriöse Ergebnisse beim Baccarat Programm?

berndoa

Top Contributor
Hallo,
klingt wie immer umständlich was ich werkle aber ist es nicht.
Es geht um das Baccaratspiel, bei dem nach diversen Regeln bis zu 6 Karten (3 für den Spieler, 3 für die Bank) gezogen werden.
Am Ende gewinnt wer mit seinen 2-3 Karten den größeren Wert hat.
(Wobei zu beachten sit dass hier modulo 10 gilt, also alle Kartenwerte zusammenzählen und mod 10 rechnen ergibt die Kartensumme.
Arbeite auch von Anfang an mit Kartenwerten 0-9 daher)

Jedenfalls, in einem ersten Schritt, wollte ich einfahc mal alle legitimen Endergebnisse eines Spiels in eienr Liste haben.
Also sowas wie (1 2 3, 4 5 6) wobei die ersten 3 Karten zum Spieler gehören, die letzten 3 Karten zur Bank.
je nachdem kann es sein dass bei Spieler oder Bank keine 3. karte gezogen wird. in dem Fall schreibe ich in die betreffende Stelle ne -1.
bspw. (2 4 -1, 8 7 4) heißt:
Spieler hat die 2 Karten 2 und 4 (Kartensumme=6, Spieler hat keine 3. Karte)
und Bank hat die Karten 8 7 und 4 (Kartensumme=(8+7+4)%10=9, Bank hat also eine 3. karte gezogen).

Um mir das Leben relativ leicht zu machen, habe ich mittels 6 for Schleifen einfahc mal ALLE möglichen Varianten für 6 Karten durchgegangen und in einer Liste gespeichert.
Dann gehe ich Alles in der Liste durch und schmeisse Alles raus, was keine "gültige" Endsituaiton gemäß Regeln ist.

Die dann verbleibende lsite müsste dann logischerweise alle möglichen gültigen Endsituationen enthalten.

Diese Liste speichere ich dann, Eintrag für Eintrag, in einer eingangs leeren .txt Datei.

So bisher mein Vorgehen.
Habe es durhclaufen lassen und in der Reslutierenden .txt Datei sind kuriose Sachen drin.
Mnche Kombination wie bspw (0 0 0,0 0 0) steht dort 7 mal drin statt einmal (keine Ahnung wie sowas passiert!).
Und andere Kombinationen die drinstehen, sind gemäß regeln unzulässig und hätten im "Remove" Schritte eigentlich shcon rausgechmissen worden sein müssen.
(Habe die eingebauten Regeln geguckt, die müssten stimmen!
Bspw ist in der Endliste ( 9 9 -1 , 9 9 9 ) drin was gegen die Allererste Regel in meiner Prüfmethode
((((a1 + a2) % 10 >= 8) || ((b1 + b2) % 10 >= 8)) && ((a3 >= 0) || (b3 >= 0)))
verstößt)


Kurzum, ich blicke nicht wo ich offensichtlich einen brachialen Denkfehler oder Prgrammierfehler drin habe bei dem Ganzen....
Oder habe ich den Iterator Teil nicht richtig gemacht?

Hier jedenfalls der Code der Hauptklasse "Test":

Java:
import java.util.ArrayList;
import java.util.Iterator;

public class Test {

    int[][] endplayfield = new int[2][3];
    ArrayList<EndGame> EndList = new ArrayList<EndGame>();
    txtManager txtendGames = new txtManager("EndGames");

    public Test() {
        built();
        System.out.println("We got a total of " + EndList.size() + " EndGames before Trimming!");
        removeFakes();
        System.out.println("We got a total of " + EndList.size() + " EndGames after Trimming!");
        saveToFile();
        System.out.println("Saved all legit EndGames to File!");
    }

    public static void main(String[] args) {
        new Test();
    }

    public void saveToFile() {
        for (EndGame e : EndList) {
            txtendGames.writeApp((e.toString() + System.lineSeparator()));
        }
    }

    public void built() {
        for (int a1 = 0; a1 <= 9; a1++) {
            endplayfield[0][0] = a1;
            for (int a2 = 0; a2 <= 9; a2++) {
                endplayfield[0][1] = a2;
                for (int a3 = -1; a3 <= 9; a3++) {
                    endplayfield[0][2] = a3;
                   
                    for (int b1 = 0; b1 <= 9; b1++) {
                        endplayfield[1][0] = b1;
                        for (int b2 = 0; b2 <= 9; b2++) {
                            endplayfield[1][1] = b2;
                            for (int b3 = -1; b3 <= 9; b3++) {
                                endplayfield[1][2] = b3;
                               
                                EndList.add(new EndGame(endplayfield));

                            }
                        }
                    }
                }
            }
        }
        EndList.trimToSize();
    }

    public void removeFakes() {
        // System.out.println("ArrayList Before : " + EndList);
        System.out.println("Now removing Fakes...");
        Iterator<EndGame> itr = EndList.iterator();


        int count = 0;
        System.out.println("Going into while");
        while (itr.hasNext()) {
            EndGame e = itr.next();

            if (!(isLegit(e))) {
                System.out.print("Removing: ");
                e.print();
                count++;
                System.out.println("Removed " + count + " EndGames so far!");
                System.out.println();
                itr.remove();
            }

        }
        EndList.trimToSize();
        // System.out.println("Out of while...");

        // System.out.println("ArrayList After : " + EndList);

    }

    public boolean isLegit(EndGame e) {
        int a1 = e.get(0, 0);
        int a2 = e.get(0, 1);
        int a3 = e.get(0, 2);
        int b1 = e.get(1, 0);
        int b2 = e.get(1, 1);
        int b3 = e.get(1, 2);

        // Natürlicher Sieg testen
        if ((((a1 + a2) % 10 >= 8) || ((b1 + b2) % 10 >= 8)) && ((a3 >= 0) || (b3 >= 0))) {
            System.out.println("Nat Sieg aber Karte gezogen");
            return false;
        }

        // Spieler
        // muss ziehen aber zieht nicht
        if (((a1 + a2) % 10 <= 5) && (a3 < 0)) {
            System.out.println("Spieler muss ziehen aber zieht nicht");
            return false;
        }
        // muss halten aber zieht karte
        if (((a1 + a2) % 10 == 6 || (a1 + a2) % 10 == 7) && (a3 >= 0)) {
            System.out.println("Spieler muss halten aber zieht karte");
            return false;
        }

        // Spieler zieht 3. Karte
        if (a3 >= 0) {

            if (((b1 + b2) % 10 <= 2) && (b3 < 0)) {
                System.out.println("(b1 + b2) % 10 <= 2) && (b3 < 0)");
                return false;
            }

            if ((b1 + b2) % 10 == 3) {

                if ((a3 != 8) && (b3 < 0)) {
                    System.out.println("(b1 + b2) % 10 == 3) (a3 != 8) && (b3 < 0)");
                    return false;

                }
                if ((a3 == 8) && (b3 >= 0)) {
                    System.out.println("(b1 + b2) % 10 == 3) (a3 == 8) && (b3 >= 0)");
                    return false;
                }
            }

            if ((b1 + b2) % 10 == 4) {

                if ((a3 >= 2 && a3 <= 7) && (b3 < 0)) {
                    System.out.println("(b1 + b2) % 10 == 4(a3 >= 2 && a3 <= 7) && (b3 < 0)");
                    return false;

                }
                if (!(a3 >= 2 && a3 <= 7) && (b3 >= 0)) {
                    System.out.println("(b1 + b2) % 10 == 4 !(a3 >= 2 && a3 <= 7) && (b3 >= 0)");
                    return false;
                }
            }

            if ((b1 + b2) % 10 == 5) {

                if ((a3 >= 4 && a3 <= 7) && (b3 < 0)) {
                    System.out.println("(b1 + b2) % 10 == 5) (a3 >= 4 && a3 <= 7) && (b3 < 0)");
                    return false;

                }
                if (!(a3 >= 4 && a3 <= 7) && (b3 >= 0)) {
                    System.out.println("(b1 + b2) % 10 == 5) !(a3 >= 4 && a3 <= 7) && (b3 >= 0)");
                    return false;
                }
            }

            if ((b1 + b2) % 10 == 6) {

                if ((a3 == 6 || a3 == 7) && (b3 < 0)) {
                    System.out.println("(b1 + b2) % 10 == 6) (a3 == 6 || a3 == 7) && (b3 < 0)");
                    return false;

                }
                if (!(a3 == 6 || a3 == 7) && (b3 >= 0)) {
                    System.out.println("(b1 + b2) % 10 == 6) !(a3 == 6 || a3 == 7) && (b3 >= 0)");
                    return false;
                }
            }

            if ((b1 + b2) % 10 == 7) {

                if (b3 >= 0) {
                    System.out.println("(b1 + b2) % 10 == 7) (b3 >= 0)");
                    return false;
                }
            }

        } else {

            // Spieler zieht keine 3. Karte

            // ...................................
            // ....................................
            // ::::::::::::::::::::::::::::::::::::
            // ::::::::::::::::::::::::::::::::::::
            // :::::::::::::::::::::::::::::::::::

            if ((b1 + b2) % 10 <= 5 && b3 < 0) {
                System.out.println("a3<0 (b1 + b2) % 10 <= 5 && b3 < 0");
                return false;
            }
            if ((b1 + b2) % 10 >= 6 && b3 >= 0) {
                System.out.println("a3<0 (b1 + b2) % 10 >= 6 && b3 >= 0");
                return false;
            }
        }

        return true;
    }

}

Die "EndGame" Objekte sind im Prinzip nur Objekten einer Klasse, in der ich ein int[2][3] mit einigen Methoden wie toString() und print() drin speichere.

Edit: Vielleicht wichtig zu erwähnen:
Wenn ich mittels new EndGame(int[2][3]) ein neues EndGame erzeuge, dann habe ich das gehardcoded dass da eine deep copy erzeugt wird.
Also an irgendwelchen ungewollten Referenzen, die ich nicht beachtet habe, sollte es eigentlich nicht liegen können. Hoffe ich :-/)
 

mihe7

Top Contributor
Keine Ahnung, wenn ich die Kombinationen erzeuge, in einen Stream klatsche, Deine isLegit-Funktion darauf anwende, dann schreibe ich am Ende 337.000 gültige Kombinationen, die keine Duplikate enthalten dürften.

Den Code klappe ich mal weg, damit der Kommentar nicht so hässlich wird :)

Java:
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class Bacara implements Iterable<int[][]>{
    public Iterator<int[][]> iterator() {
        return new Iterator<>() {
            private int number;
            final int size = 1100 * 1100;
            @Override
            public boolean hasNext() {
                return number < size;
            }
            @Override
            public int[][] next() {
                int upper = number / 1100;
                int lower = number % 1100;
                number++;
                return new int[][]{
                    {upper / 110, (upper % 110) / 11, ((upper % 110) % 11) - 1},
                    {lower / 110, (lower % 110) / 11, ((lower % 110) % 11) - 1}
                };
            }
        };
    }
    public Stream<int[][]> combinations() {
        final int size = 1100 * 1100;
        return StreamSupport.stream(Spliterators.spliterator(iterator(), size, Spliterator.DISTINCT), false);
    }
    public static boolean isLegit(int[][] game) {
        int a1 = game[0][0];
        int a2 = game[0][1];
        int a3 = game[0][2];
        int b1 = game[1][0];
        int b2 = game[1][1];
        int b3 = game[1][2];
        // Natürlicher Sieg testen
        if ((((a1 + a2) % 10 >= 8) || ((b1 + b2) % 10 >= 8)) && ((a3 >= 0) || (b3 >= 0))) {
            return false;
        }
        // Spieler
        // muss ziehen aber zieht nicht
        if (((a1 + a2) % 10 <= 5) && (a3 < 0)) {
            return false;
        }
        // muss halten aber zieht karte
        if (((a1 + a2) % 10 == 6 || (a1 + a2) % 10 == 7) && (a3 >= 0)) {
            return false;
        }
        // Spieler zieht 3. Karte
        if (a3 >= 0) {
            if (((b1 + b2) % 10 <= 2) && (b3 < 0)) {
                return false;
            }
            if ((b1 + b2) % 10 == 3) {
                if ((a3 != 8) && (b3 < 0)) {
                    return false;
                }
                if ((a3 == 8) && (b3 >= 0)) {
                    return false;
                }
            }
            if ((b1 + b2) % 10 == 4) {
                if ((a3 >= 2 && a3 <= 7) && (b3 < 0)) {
                    return false;
                }
                if (!(a3 >= 2 && a3 <= 7) && (b3 >= 0)) {
                    return false;
                }
            }
            if ((b1 + b2) % 10 == 5) {
                if ((a3 >= 4 && a3 <= 7) && (b3 < 0)) {
                    return false;
                }
                if (!(a3 >= 4 && a3 <= 7) && (b3 >= 0)) {
                    return false;
                }
            }
            if ((b1 + b2) % 10 == 6) {
                if ((a3 == 6 || a3 == 7) && (b3 < 0)) {
                    return false;
                }
                if (!(a3 == 6 || a3 == 7) && (b3 >= 0)) {
                    return false;
                }
            }
            if ((b1 + b2) % 10 == 7) {
                if (b3 >= 0) {
                    return false;
                }
            }
        } else {
            if ((b1 + b2) % 10 <= 5 && b3 < 0) {
                return false;
            }
            if ((b1 + b2) % 10 >= 6 && b3 >= 0) {
                return false;
            }
        }
        return true;        
    }
    public static void main(String[] args) throws IOException {
        
        Stream<String> lines = new Bacara().combinations()
                .filter(Bacara::isLegit)
                .map(elem -> Arrays.toString(elem[0]) + "; " + Arrays.toString(elem[1]));
                
        Files.write(Paths.get("files.txt"), (Iterable<String>) lines::iterator, StandardCharsets.UTF_8);
        long count = new Bacara().combinations()
                .filter(Bacara::isLegit)
                .map(elem -> Arrays.toString(elem[0]) + "; " + Arrays.toString(elem[1]))
                .count();
        System.out.printf("Written %d lines to disk%n", count);
    }
}
 

berndoa

Top Contributor
Hm, auf 337000 Sachen komme ich auch (Verdächtig dass da so eine glatte Zahl rauskommt...).
Nur kommt bspw. (000,000) bei mir 10 mal(!) in der Datei vor.
Und wie erwähnt das nach Regeln ungültige (9 9 -1,9 9 9) habe ich auch in der Datei.
komisch...
 

berndoa

Top Contributor
Obs vielleicht am Shcriebvorgang an sich liegt?
Meine txtManager Klasse sieht so aus:
Java:
import java.io.*;
import java.util.Scanner;

public class txtManager {

    String filepath = ".\\TimeStamp.txt";

    File file;

    FileWriter fw;
    
    public txtManager(String filename) {
     filepath=".\\"+filename+".txt";   
     file = new File(filepath);
     //System.out.println("filepath="+filepath);
    }

    public String read() {
        try {

            Scanner in = new Scanner(new FileReader(file));
            StringBuilder sb = new StringBuilder();
            while (in.hasNext()) {
                sb.append(in.next());
            }
            in.close();
            String outString = sb.toString();
            return outString;

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }
    
    public void writeApp(String a) {
        try {
            fw = new FileWriter(file, true);

            fw.write(a);
            fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   

    public void write(String a) {
        try {
            fw = new FileWriter(file, false);

            fw.write(a);
            fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Eigentlich ganz simpel.
Dem Konstruktor wird der gewünschte Dateiname als Argument übergeben.
Und es gibt halt eine read Methode, die den Dateiinhalt als String rausgibt.

Und 2 Shcreibmethoden, die entweder den Eingabestring an den Text anhängt writeApp() oder den Textinhalt ersetzt durhc den String write().

Sollte eigentlich nicht falsch sein, schließlich schreibt er ja auch in die Datei.
Nur was er halt schreibt...
 

berndoa

Top Contributor
Ist dann zwar keine shcöne Trennung mehr aber vielleicht sollte ich direkt beim Erzeugen der Kombinationen gleich prüfen ob diese zulässig ist . Und nur zuölässige überhaupt erst auf die Liste lassen?

Wobei mir das nicht so gefallen würde

Edit:
Problm hat sich wohl gerade geklärt, muss mal stichprobenartig durchgucken ob Alle darin vorkommenden Kombinationen nun keine Regeln mehr verletzen...
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
Hallo,
klingt wie immer umständlich was ich werkle aber ist es nicht.
Es geht um das Baccaratspiel, bei dem nach diversen Regeln bis zu 6 Karten (3 für den Spieler, 3 für die Bank) gezogen werden.
Am Ende gewinnt wer mit seinen 2-3 Karten den größeren Wert hat.
(Wobei zu beachten sit dass hier modulo 10 gilt, also alle Kartenwerte zusammenzählen und mod 10 rechnen ergibt die Kartensumme.
Arbeite auch von Anfang an mit Kartenwerten 0-9 daher)

Jedenfalls, in einem ersten Schritt, wollte ich einfahc mal alle legitimen Endergebnisse eines Spiels in eienr Liste haben.
Also sowas wie (1 2 3, 4 5 6) wobei die ersten 3 Karten zum Spieler gehören, die letzten 3 Karten zur Bank.
je nachdem kann es sein dass bei Spieler oder Bank keine 3. karte gezogen wird. in dem Fall schreibe ich in die betreffende Stelle ne -1.
Also ich weiß ja nicht auf was Du letztendlich abzielst. Falls Du aber vor hast, Baccarat zu programmieren solltest Du nicht mit Wahrscheinlichkeitsanalysen beginnen. Besser wäre es, Klassen wie Karte , Kartenschlitten, Hand etc .zu entwickeln.
Geht es Dir aber nur um den oben beschriebenen Fall, dann ist Deine Kartenverteilung nicht korrekt.
Baccarat wird mit 6 Decks a 52 Blatt gespielt. Wobei Werte von 1 - 10, und B, D, K enthalten sind. Die Werte befinden sich in der Restklasse 10. Also 1,2,3,4,5,6,7,8,9, 0, 0, 0, 0. Also die 0 kommt 4 x vor. Das müsstest Du in Deinen Kombinationen berücksichtigen.
Es ist außerdem eine Wahrscheinlichkeit mit Wegnehmen. Gezogene Karten sind nicht mehr dabei.
Eine Variante die Ergebnisse zu berechnen, wäre eine Simulation, die die Ziehregeln kennt und die Ergebnisse zählt.
Also 10 Counter für die Werte 0-9. --> Wahrscheinlichkeit des Auftretens eines Ergebnisses kann mit der Anzahl der Spiele berechnet werden.
 

berndoa

Top Contributor
Also ich weiß ja nicht auf was Du letztendlich abzielst. Falls Du aber vor hast, Baccarat zu programmieren solltest Du nicht mit Wahrscheinlichkeitsanalysen beginnen. Besser wäre es, Klassen wie Karte , Kartenschlitten, Hand etc .zu entwickeln.
Geht es Dir aber nur um den oben beschriebenen Fall, dann ist Deine Kartenverteilung nicht korrekt.
Baccarat wird mit 6 Decks a 52 Blatt gespielt. Wobei Werte von 1 - 10, und B, D, K enthalten sind. Die Werte befinden sich in der Restklasse 10. Also 1,2,3,4,5,6,7,8,9, 0, 0, 0, 0. Also die 0 kommt 4 x vor. Das müsstest Du in Deinen Kombinationen berücksichtigen.
Es ist außerdem eine Wahrscheinlichkeit mit Wegnehmen. Gezogene Karten sind nicht mehr dabei.
Eine Variante die Ergebnisse zu berechnen, wäre eine Simulation, die die Ziehregeln kennt und die Ergebnisse zählt.
Also 10 Counter für die Werte 0-9. --> Wahrscheinlichkeit des Auftretens eines Ergebnisses kann mit der Anzahl der Spiele berechnet werden.
Ich muss mal dumm fragen:
Wie ist denn in einem Deck oder Ähnlichem die Verteilung von Ass Karten zu anderen?

Normalerweise gibt es ja die Karten 1,2,3,4,5,6,7,8,9,10,Bube,Dame,König,Ass generell.
Würde nahelegen dass es an fürs baccarat relevanten Werten 4 Mal 0, 2 Mal 1 sowie je einmal die Werte 2-9 gibt.

Also, wenn man aus einem solchen Deck eine Karte zieht, die mit Wahrshceinlichkeit 4/16 Wert 0 hat, 2/16 Wert 1 hat und zu je 1/16 einen der anderen Werte.

Stimmt das so? Oder nicht?

Weil bspw. auf https://www.onlinecasinosdeutschland.com/baccarat/regeln/
ist mitten auf der Seite ein bild wo irgendwie 4 Asse (halt mit den 4 Pike, herz und so) vorkommen und die anderen Karten aber nur einmal.

Wie ist da die "Häufigkeit" der Karten so?

"Ohne" Zurücklegen will ich aktuell noch gar nicht rechnen, ich geh jetzt einfahc mal davon aus wie wenn bei jedem Ziehen einer Karte aus einem völlig neuen Deck gezogen wird.

Weil, ich will das fürs Onlinecasino berehcnen und dort arbeiten die ja eh mit Zufallsgeneratoren, also geht dort "Kartenzählen" eh nicht.


Habe in meinem aktuellen Programm mal damit gearbeitet wie es auf dem bild auf der Webseite gezeigt wird (also 4 mal ass, die 3 verschiedenen Bildkarten sowie die Karten 1-10 halt) und komme da auf Wahrshceinlichkeiten von ca. 35% für den Spieler, 35% für die Bank und 9,6% für unentschieden.
Was laut google falsch ist, da da eher so 44% vs 45% vs 9,6% rauskommen sollte.


PS: Ich will nicht wirklich baccarat spielen per se sodnern mehr nur als "Mittel zum zweck" alle möglichen (zulässigen" Spielenden konstruieren, gucken wie wahrscheinlich ist jedes und wer gewinnt.
Und durchs Zusammenzählen der wharshceinlichkeiten für spieler, bank und unentschieden eifnahc mal gucken was am Wahrshceinlichsten ist.
Und damit natürlich ann simpel berechnen wodrauf zu wetten 8unter berücksichtigung der verschiedenen Auszahlugnen pro option) am besten ist.
 

Blender3D

Top Contributor
Also, wenn man aus einem solchen Deck eine Karte zieht, die mit Wahrshceinlichkeit 4/16 Wert 0 hat, 2/16 Wert 1 hat und zu je 1/16 einen der anderen Werte.

Stimmt das so? Oder nicht?
Bei einem Deck gibt es von jedem Typ == A ,2, 3, .. ,10 , B,D K *4
Also 4 Asse - 9 und 16 x die 0 (10,B,D,K)
Bei nur einem Kartendeck ist die Chance eine 0 zu ziehen bei der 1ten Karte 16 / 52 = 4 /13
Bei der 2ten Karte falls die 1te eine 0 war 15/51 sonst 16/51 usw.
Also das hängt auch ab von der Anzahl der verwendeten Decks. Es gibt Varianten mit 1 , 6, 8 Decks.
Hier ein interessanter Link dazu https://wizardofodds.com/games/baccarat/
 

berndoa

Top Contributor
Hm, habe jetzt mal sehr umständlich das programmiert mit einem nDeck 8also n Decks) wo ich bei jeder Berechnung die bis zu 6 Karten ziehe und damit die Wahrscheinlichkeiten und Co. berechne.
Und danach das Deck halt ieder auf die n*52 Karten zurücksetze.

Nur komme ich trotz Allem immer noch nur auf Wahrshceinlichkeiten von ca 33 vs 9,5 vs 33.
Also generell uimmer rund 10% zu wenig als es bei Spieler oder Bank sein sollte :-/

Irgendwas muss ich da fundamental falsch haben :-/

Edit: Konkret komme ich auf
Spieler: 0.3285375832835468, Unentschieden: 0.0950687113358116, Bank: 0.3409117322700019 !
 

Blender3D

Top Contributor
Hm, habe jetzt mal sehr umständlich das programmiert mit einem nDeck 8also n Decks) wo ich bei jeder Berechnung die bis zu 6 Karten ziehe und damit die Wahrscheinlichkeiten und Co. berechne.
Und danach das Deck halt ieder auf die n*52 Karten zurücksetze.
Ich habe das jetzt mit oben beschrieben Klassen gemacht und bekomme das richtige Resultat.
1668213515252.png
Java:
import java.util.Arrays;
import baccarat.BaccaratGame;
import baccarat.BaccaratHand;
import baccarat.BaccaratShoe;

public class StartBaccarat {
    public final static int PUNTO = 1;
    public final static int BANCO = 0;
    public final static int TIE = 2;

    public static void main(String[] args) {
        int[] states = new int[3];
        int n = 10000000;
        BaccaratShoe shoe = new BaccaratShoe(6);
        BaccaratGame game = null;
        for (int i = 0; i < n; i++) {
            game = doGame(shoe);
            addResult(states, game);
        }
        System.out.println("| Banco\t| Punto\t| Tie\t| x " + n);
        System.out.println(Arrays.toString(states));
        System.out.println(Arrays.toString(resultToPercent(states, n)));

    }

    public static BaccaratGame doGame(BaccaratShoe shoe) {
        if (shoe.isRiffleTime())
            shoe.reset();
        BaccaratHand punto = new BaccaratHand(shoe.drawCard(), shoe.drawCard());
        BaccaratHand banco = new BaccaratHand(shoe.drawCard(), shoe.drawCard());
        BaccaratGame game = new BaccaratGame(punto, banco);
        do {
            game.nextCard(shoe);
        } while (!game.isOver());
        return game;
    }

    public static void addResult(int[] states, BaccaratGame game) {
        int id = BANCO;
        if (game.isTie())
            id = TIE;
        else if (game.isPuntoWinner())
            id = PUNTO;
        states[id]++;
    }

    public static double[] resultToPercent(int[] states, int num) {
        double[] tmp = new double[3];
        double p1 = num / 100.0;
        for (int i = 0; i < states.length; i++)
            tmp[i] = states[i] / p1;
        return tmp;
    }
}
 

berndoa

Top Contributor
Hm, keien AHnung was ich dann falsch mache.
Sehe ich das richtig dass du generell die Ergebnisse gleich gewichtest?

Also schlicht zusammenzählst wie oft bei einem Spiel der Spieler, die Bank oder unentschieden rauskam?
Weil ich versuche da bei jedem Spiel die Wahrscheinlichkeit zu bestimmen mit der dieses Spiel so passiert.

Starte also mit 3 int SpielerOdds,EqualOdds,BankOdds=0 und bei einem Spiel gucke ich dann wer hoch ist dessen Wahrshceinlichkeit und je nahc Gewinner wird das dann zur betreffenden Wahrshceinlichkeit dazugezählt.

Wenn also ein bestimmtes Endergebnis total unwahrshceinlich ist, wir es gewissermassen dann auch nur mit dieser niedrigen gewichtung hinzugefügt.

Müsste mal testen wenn ich einfach nur abzähle, was wie oft vorkommt, ob ich da dann auf ie "richtigen" Werte komme.
Wobei das streng genommen dann doch falsch wäre, oder?
Schließlich wird ja bspw., eine Karte mit Wert 0 nicht genauso oft gezogen wie eine Karte mit anderen Wert (weils für wert=0 4 Karten gibt und für die anderen Werte je nur 1 Karte. Auf ein Deck bezogen dann eben 16 karten vs 4. und beim nDeck eben n*16 vs n*4).

Edit: Habe womöglich den Fehler gefunden, mal warten bis er wieder ganz durchgelaufen ist...
 
Zuletzt bearbeitet:

berndoa

Top Contributor
Bin nun mal higegangennen, habe meine Liste aller legitimen Spiele genommen und sie alle gleichgewichtig. Und einfahc abgezählt, wie viele gingen für Spieler, Bnk oder Unentshcieden aus.
Am Ende noch durhc die Anzahl aller legitimen Spiele geteilt um Kommazahlen zu kriegen.

Dabei kam ich nun auf
Java:
Spieler: 0.46409495548961427, Unentschieden: 0.10118694362017804, Bank: 0.43471810089020774 !

Also wnen ich so weitermache, komme ich irgendwann npch auf den Wert, der überall im Internt steht! :-D
 

Blender3D

Top Contributor
Hm, keien AHnung was ich dann falsch mache.
Sehe ich das richtig dass du generell die Ergebnisse gleich gewichtest?
Ich habe einfach eine Simulation des Spieles Punto Banco programmiert.
Das umfasst einen Baccarat Schlitten mit 6 Decks a 52 Blatt. Baccarad Hand Baccarad Spiel usw.
Dann lasse ich eine große Zahl Spiele durchführen und zähle die Ergebnisse. That's it.
Siehe #11
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Intressante Benchmark-Ergebnisse mit Listen. Weiss jemand wie man diese erklaeren kann? Allgemeine Java-Themen 15
J Bei einer Zufallsausgabe werden zu viel Ergebnisse ausgegeben Allgemeine Java-Themen 16
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
E Falsche Ergebnisse bei PQ-Formel Berechnung Allgemeine Java-Themen 12
G Input/Output URLDecoder.decode - Unterschiedliche Ergebnisse Windows / Linux Allgemeine Java-Themen 2
C Batchdatei ausführen und Ergebnisse abfragen Allgemeine Java-Themen 8
D Problem mit java.util.scanner: Falsche Ergebnisse Allgemeine Java-Themen 4
K Regex für Ergebnisse (9:9, 2:1.) Allgemeine Java-Themen 3
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
L Suchvorschläge beim eingeben einzelner Buchstaben Allgemeine Java-Themen 3
B Compiler-Fehler NullPointerException beim Auslesen von .lang-Datei Allgemeine Java-Themen 3
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
reibi Classpath Classpath Variable beim Tomcat Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben