Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde



  • @omggg Wie wäre es, wenn du selber rechnest? Du hast die Wahrscheinlichkeit, das Spieler 1 gewinnt (damit auch die, dass Spieler 1 nicht gewinnt) und die, das Spieler 2 gewinnt.

    Die Wahrscheinlichkeit, das nur Spieler 2 gewinnt ist P=(1P(Spieler 1 gewinnt))P(Spieler 2 gewinnt)P = (1-P(\text{Spieler 1 gewinnt})) * P(\text{Spieler 2 gewinnt})

    Edit: Um ein Gefühl dafür zu bekommen (und weil wir ein c++ Forum sind), kann man sich sowas auch simulieren

    #include <random>
    #include <print>
    #include <map>
    
    int main()
    {
      const int runs = 10;
      std::default_random_engine generator;
      std::bernoulli_distribution player1(0.75);
      std::bernoulli_distribution player2(0.45);
    
      std::map<bool, std::string> output{ {false, "lost"}, {true, "won"} };
    
      for (int i = 0; i < runs; ++i) {
        const auto resultPlayer1(player1(generator));
        const auto resultPlayer2(player2(generator));
        std::println("Player 1 {}, Player 2 {}", output[resultPlayer1], output[resultPlayer2]);
      }
      return 0;
    }
    

  • Mod

    @omggg sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:

    @SeppJ sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:
    Auf diese 53 % bei n=6 bin ich nun auch durch Rekursion gekommen, genauer, auf 0.533935546875 ...

    Erstens gibt es dafür die hier schon viel erwähnte Binomialverteilung, die dir direkt als Formel sagt, wie wahrscheinlich X Siege in N Versuchen sind. Zweitens gilt hier wieder wie bei meinem Aufsatz oben, dass die Zahlen so klein sind, dass man das einfach direkt ohne Formalismus ausrechnen kann, wenn man sich nur ein paar Minuten zum Nachdenken gönnt:

    • Was sind die Möglichkeiten, (mindestens) 5 Mal von 6 zu gewinnen? Zum einen kann man alle 6 gewinnen, zum anderen alle Möglichkeiten, wo man genau einmal verliert (also 5 Mal gewinnt). Diese sind alle trivial zu berechnen
    • 6 Siege sind offensichtlich P(X=6)=p6P(X=6) = p^6, bei p=0.75p=0.75 knapp 18%.
    • 5 Siege sind offensichtlich p5(1p)p^5 (1-p), weil man 5 Mal siegen und einmal verlieren muss
    • Es gibt 6 Varianten, wie man 5 Mal siegt, weil es egal ist, zu welchem der 6 Versuche man verliert. All diese Möglichkeiten schließen sich gegenseitig aus, man darf/muss also die Einzelwahrscheinlichkeit 6 mal nehmen um die Wahrscheinlichkeit zu bekommen, dass eine der Kombinationen mit 5 Siegen auftritt: P(X=5)=6p5(1p)P(X=5) = 6 p^5 (1-p), bei p=0.75p=0.75 gut 35%
    • Das man genau 6 Mal oder genau 5 Mal gewinnt, schließt sich offensichtlich ebenfalls gegenseitig aus, die Wahrscheinlichkeit für P(X5)P(X\geq5) ist daher die Summe P(X5)=P(5)+P(6)=6p5(1p)+p6P(X\geq5) = P(5) + P(6) = 6 p^5 (1-p) + p^6. Für p=0.75p=0.75 sind das die erwähnten gut 53%.

    Und so kann man sich das für solch kleine Zahlen herleiten, ganz ohne Binomialkoeffizienten kennen zu müssen. Das einzige was wir wissen mussten, ist, dass unabhängige(!) Wahrscheinlichkeiten multipliziert werden müssen, wenn man will, dass ein Ereignis UND ein anderes eintreffen sollen, und addiert werden müssen, wenn man eines ODER ein anderes will (wenn die sich gegenseitig ausschließen!).

    Btw: Chat GPT (4) sagt bei mir, es kenne keine Formel dafür, nur probalistische Methoden. 😃

    Kein Kommentar, außer dass du hoffentlich etwas daraus lernst.
    PS: Doch ein Kommentar, falls die Ironie nicht reicht: Neben meiner speziellen Formel oben für 5 aus 6 ist die allgemeine Formel, die jedermann in der Oberstufe oder im ersten Semester Uni lernt, dafür was die Wahrscheinlichkeiten für k Erfolge mit Wahrscheinlichkeit p bei N Versuchen ist:
    P(k,N,p)=N!k!(Nk)!pk(1p)NkP(k, N, p) = \frac{N!}{k!(N-k)!}p^k(1-p)^{N-k}
    Du erkennst das in meiner billig hergeleiteten Formel oben die Koeffizienten als 6 bzw. 1 herauskamen.


  • Gesperrt

    @Schlangenmensch Ja, aber du arbeitest da mit random und näherst dich immer weiter dem genauen Ergebnis an, das wollte ich vermeiden (also den probabilistischen Ansatz).

    Außerdem sehe der Code in C/C++ sehr ähnlich aus.

    Eigentlich kann es bei der Rekursion doch nur jeweils 4 Ausgänge geben: Keiner gewinnt, 1 gewinnt, 2 gewinnt oder beide gewinnen. Deshalb weiß ich nicht, ob meine Funktion (Zeile 16 bis 18) richtig ist ... weil das: 2 gewinnt und 1 verliert, quasi verschluckt wird. 🤷♂


  • Gesperrt

    @SeppJ sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:

    PS: Doch ein Kommentar, falls die Ironie nicht reicht: Neben meiner speziellen Formel oben für 5 aus 6 ist die allgemeine Formel, die jedermann in der Oberstufe oder im ersten Semester Uni lernt, dafür was die Wahrscheinlichkeiten für k Erfolge mit Wahrscheinlichkeit p bei N Versuchen ist:
    P(k,N,p)=N!k!(N−k)!pk(1−p)N−kP(k, N, p) = \frac{N!}{k!(N-k)!}pk(1-p){N-k}P(k,N,p)=​k!(N−k)!​​N!​​p​k​​(1−p)​N−k​​
    Du erkennst das in meiner billig hergeleiteten Formel oben die Koeffizienten als 6 bzw. 1 herauskamen.

    Bitte poste doch korrekte Formeln (oder gar keine ...). Da kommt 0.35595703125 heraus, was natürlich ganz daneben ist:

    https://www.wolframalpha.com/input?i=((6!)%2F(5!(6-5)))0.75^5(1-0.75)^(6-5)

    Es gilt ja eben nicht, p_1 + (1-p_2) = 1 ...

    Aber ich verstehe schon, ich bin hier nicht gerne gesehen, deshalb kann @Schlangenmensch und Du mir Blödsinn erzählen ("merkt der ja eh nicht ..."). 😞

    Meine Frage war, ob 0.533935546875 exzakt ist oder nicht. Machts gut.


  • Mod

    Tipp: Wenn du andere kritisierst, dann denk vorher eine Minute nach. Besonders bei Mathematik.

    Was "Addition" ist, erkläre ich dir aber jetzt nicht. Frag dazu deinen Lehrer, ob ihr dafür schon weit genug seid.


  • Gesperrt

    Schau dir doch bitte die Partialsummen einmal an:

    https://www.wolframalpha.com/input?i=sum((n!)%2F(5!(n-5)!)0.75^5(1-0.75)^(n-5)%2Cn%3D0%2C6)

    und das Endergebnis stimmt nicht, nach der Formel ist es 0.59326171875,

    wenn ich für 1-0.75 0.45 einsetze, ist es 0.87802734375.

    In meinem Sprachgebrauch ist das "unbrauchbar".


  • Mod

    Was soll dieser Müll, den du da in WA eingetippt hast, mit meinem Beitrag (oder sonst irgendwas) zu tun haben? Du hast weder meine Beiträge noch irgendeinen der Links gelesen und setzt stattdessen wild Zahlen in Formeln ein, ohne sie zu verstehen. Was bedeutet N? Was machst du stattdessen damit? Das erinnert leider sehr an das Klischee des Grundschülers, der immer alle Zahlen in einer Textaufgabe addiert und hofft, dass das schon stimmt.

    Wenn du sowieso nicht liest, brauche ich auch nichts zu schreiben. Habe ich vor langer Zeit schon festgestellt, aber ich wollte mal probieren, ob du reifer geworden bist und habe spaßeshalber geantwortet. Leider eher das Gegenteil.

    PS: Als ein letzter Gefallen: 0.533935546875 ist exakt, oder 2187/4096 wenn dir das besser gefällt.


  • Gesperrt

    @SeppJ sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:

    PS: Als ein letzter Gefallen: 0.533935546875 ist exakt, oder 2187/4096 wenn dir das besser gefällt.

    Siehst du, geht doch.

    Manche Leute sitzen auf einem hohen Ross und bemerken gar nicht, dass man auch nach unten schauen kann. 😉

    Soll heißen: So etwas wie "Argumentum ad hominem"/"Grundschulniveau" kann man sich doch sparen ... Der nächste kommt an und behauptet, ja, die Primfaktorzerlegung konnte ich ja schon im Kindergarten.


  • Gesperrt

    Was wäre denn, wenn ich nun behaupten würde,

    0.533935546875 sei falsch und

    0.5661862967491151 (also 56%, nicht 53%) sei die genaue Wahrscheinlichkeit für das Ende des Spiels nach 6 Runden?

    Spoiler:

    public class Wahr {
        public static void main(String[] args) {
            System.out.println("n=05: " + w(0, 0, 0, 15, 9, 20, 5));
            System.out.println("n=06: " + w(0, 0, 0, 15, 9, 20, 6));
            System.out.println("n=07: " + w(0, 0, 0, 15, 9, 20, 7));
        }
    
        public static double w(int deep, int w1, int w2, int p1, int p2, int n, int maxDeep) {
            if (deep > maxDeep) {
                return 0;
            }
            if (w1 == 5 || w2 == 5) {
                return 1;
            }
            double f = 1.0 / (n * n);
            double w0 = 0;
            w0 += ((n - p1) * (n - p2)) * f * w(deep + 1, w1, w2, p1, p2, n, maxDeep);
            w0 += (p1 * (n - p2)) * f * w(deep + 1, w1 + 1, w2, p1, p2, n, maxDeep);
            w0 += ((n - p1) * p2) * f * w(deep + 1, w1, w2 + 1, p1, p2, n, maxDeep);
            w0 += (p1 * p2) * f * w(deep + 1, w1 + 1, w2 + 1, p1, p2, n, maxDeep);
            return w0;
        }
    }
    


  • @omggg sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:

    deshalb kann @Schlangenmensch und Du mir Blödsinn erzählen ("merkt der ja eh nicht ..."). 😞

    Wo habe ich Blödsinn geschrieben? Ich habe nur den Fall betrachtet, das Spieler 2 ein Spiel gewinnt und Spieler 1 verliert oO

    Und, @SeppJ hat logisch hergeleitet, dass N=5 Spiele nicht ausreichen können, und bei N=6 Spieler 1 ausreicht, um über 50 Prozent zu kommen. Und nur darauf bezieht sich die 53%

    Ich komme für eine genaue Wahrscheinlichkeit auf 0,6031, denn du muss den Fall hinzuaddieren, dass Spieler 2 6 aus 6 gewinnt (0.0083), und das Spieler 2 5 aus 6 gewinnt (0.0609).

    Da sich Gewinne gegenseitig nicht ausschließen sollten die Einzelwahrscheinlichkeiten unabhängig voneinander sein.


  • Gesperrt

    Danke erst mal,

    @Schlangenmensch sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:

    denn du muss den Fall hinzuaddieren, dass Spieler 2 6 aus 6 gewinnt (0.0083), und das Spieler 2 5 aus 6 gewinnt (0.0609).

    Jaein ... Spieler 2 (oder Spieler 1) kann doch gar nicht 6 aus 6 gewinnen, da das Spiel vorher beendet wäre...

    @Schlangenmensch sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:

    Da sich Gewinne gegenseitig nicht ausschließen sollten die Einzelwahrscheinlichkeiten unabhängig voneinander sein.

    Und wie kann ich das erreichen?


  • Gesperrt

    Es könnte jedoch die Hälfte der Rechenzeit eingespart werden durch einfaches Pruning:

    public class Wahr {
        public static void main(String[] args) {
            System.out.println("n=05: " + w(0, 0, 0, 15, 9, 20, 5));
            System.out.println("n=06: " + w(0, 0, 0, 15, 9, 20, 6));
            System.out.println("n=07: " + w(0, 0, 0, 15, 9, 20, 7));
        }
    
        public static double w(int deep, int w1, int w2, int p1, int p2, int n, int maxDeep) {
            if (deep >= maxDeep) {
                return w1 == 5 || w2 == 5 ? 1 : 0;
            }
            if (w1 == 5 || w2 == 5) {
                return 1;
            }
            double f = 1.0 / (n * n);
            double w0 = 0;
            w0 += ((n - p1) * (n - p2)) * f * w(deep + 1, w1, w2, p1, p2, n, maxDeep);
            w0 += (p1 * (n - p2)) * f * w(deep + 1, w1 + 1, w2, p1, p2, n, maxDeep);
            w0 += ((n - p1) * p2) * f * w(deep + 1, w1, w2 + 1, p1, p2, n, maxDeep);
            w0 += (p1 * p2) * f * w(deep + 1, w1 + 1, w2 + 1, p1, p2, n, maxDeep);
            return w0;
        }
    }
    


  • @omggg Die Frage war doch, wie wahrscheinlich ist es in 6 Spielen mindestens 5 mal zu gewinnen. Dafür muss du alle möglichen Varianten betrachten, die 5 Siege beinhalten. Die Frage war nicht, wie wahrscheinlich ist es exakt 5 mal zu gewinnen.

    @omggg sagte in Mathe, Stochastik, zwei Spieler spielen wiederholt eine Runde:

    Und wie kann ich das erreichen?

    Wobei? Die Frage verstehe ich gerade nicht, habe ich noch nicht genug Kaffee für getrunken.


  • Gesperrt

    🤔 Für hierauf aufbauende Folgeberechnungen ist, "wird schon so ungefähr richtig sein", immer schlecht ... nicht umsonst gibt es doch genaue Rundungs- und Fehleregeln usw.

    Aber vielleicht ist dieses Wissen auch nur echten Mathematikern vorbehalten, und der bin ich ja nicht. 🤷♂



  • @omggg Nein, hier geht es nicht um "wird so ungefähr richtig sein". Es gibt bei 6 Spielen zwei Möglichkeiten die ersten 5 Spiele zu gewinnen: Man gewinnt die ersten 5 und verliert das 6. oder man gewinnt alle 6. Beide Wahrscheinlichkeiten müssen für 5 aus 6 mit betrachtet werden, auch wenn du bei einem Experiment nach 5 Siegen aufhören könntest.


  • Gesperrt

    🙈 Ich glaube, ich habe den Fehler inzwischen selber gefunden ...

    Da 75 % + 45 % größer als 1 ist, schließen sich die Ereignisse nicht gegenseitig aus (sind nicht mutually exclusive) ... und damit dürfen sie auch nicht addiert werden:

    https://math.stackexchange.com/questions/2636056/probability-for-sum-of-events-greater-than-1

    Das heißt, mein Ansatz (oder meine Ansätze) wird vermutlich falsch sein, weil ich in den Methoden Wahrscheinlichkeiten addiere.

    Das war die gute Nachricht. Die schlechte ist, ich weiß nicht, wie das anders geht. Ich leg's dann mal auf Eis.



  • @omggg Ich glaube, du hast die Antwort falsch verstanden. Es geht nicht darum das man Wahrscheinlichkeiten dann überhaupt nicht addieren kann. Da steht nur, das die Wahrscheinlichkeit, das Spieler 1 gewinnt, oder Spieler 2 gewinnt, nicht die Addition der Einzelwahrscheinlichkeiten ist (die ja in deinem Fall größer 1 wäre).


  • Gesperrt

    @Schlangenmensch Dennoch, mit der Variante aus https://www.c-plusplus.net/forum/topic/354643/mathe-stochastik-zwei-spieler-spielen-wiederholt-eine-runde/29 komme ich nicht auf das Ergebnis von https://www.c-plusplus.net/forum/topic/354643/mathe-stochastik-zwei-spieler-spielen-wiederholt-eine-runde/16 (0.533935546875), und ich weiß nicht, ob dies als absolut richtig betrachtet werden kann, weil @SeppJ einfach nur geschrieben hat, dass es lediglich genau sei, und weil es mir spanisch vorkommt, dass das Ereignis "Spieler 2 gewinnt, aber Spieler 1 nicht" nicht explizit auftaucht. Das sollte doch dabei sein?


  • Gesperrt

    Hmmm, auch Monte-Carlo bestätigt die 0.533935546875 nicht direkt ... Es sagt, durchschnittlich sei nach 6,65 Runden Schluss:

    import java.util.ArrayList;
    import java.util.IntSummaryStatistics;
    import java.util.List;
    
    public class Wahr {
        public static void main(String[] args) {
            System.out.println("n=6: " + w(0, 0, 0, 15, 9, 20, 6));
            monteCarlo(15, 9, 20, 6);
        }
    
        public static double w(int deep, int w1, int w2, int p1, int p2, int n, int maxDeep) {
            if (deep > maxDeep) {
                return 0;
            }
            if (w1 == 5 || w2 == 5) {
                return 1;
            }
            double w0 = 0;
            w0 += (n - Math.max(p1, p2)) * 1.0 / n * w(deep + 1, w1, w2, p1, p2, n, maxDeep);
            w0 += (Math.max(p1, p2) - Math.min(p1, p2)) * 1.0 / n * w(deep + 1, w1 + 1, w2, p1, p2, n, maxDeep);
            w0 += Math.min(p1, p2) * 1.0 / n * w(deep + 1, w1 + 1, w2 + 1, p1, p2, n, maxDeep);
            return w0;
        }
    
        public static void monteCarlo(int p1, int p2, int n, int max) {
            List<Integer> endsAfter = new ArrayList<>();
            for (int j = 0; j < 10000; j++) {
                int wins1 = 0;
                int wins2 = 0;
                for (int i = 0; i < 100; i++) {
                    int r = (int) (Math.random() * n);
                    if (r < Math.min(p1, p2)) {
                        wins1++;
                        wins2++;
                    } else if (r < Math.max(p1, p2)) {
                        wins1++;
                    }
                    if (wins1 == 5 || wins2 == 5) {
                        endsAfter.add(i + 1);
                        break;
                    }
                }
            }
            IntSummaryStatistics iss = endsAfter.stream().mapToInt(Integer::intValue).summaryStatistics();
            System.out.println(iss);
            long count1 = endsAfter.stream().filter(i -> i == max).count();
            long count2 = endsAfter.stream().filter(i -> i != max).count();
            System.out.println(count1 + " " + count2);
            System.out.println(1.0 * count1 / count2);
        }
    }
    

    Also los ... wo ist der Wurm?

    Bestimmt ist Zeile 49 falsch. 🤒



  • Ich denke der Wurm wird in der Hauptsache darin liegen, dass du nicht weiß was du tust.

    In diesem und in zwei weiteren Foren kursiert eine Formel, die das gewünschte berechnen soll. Mangels deiner Kenntnisse in allen MINT Disziplinen kannst du das nichtmal verifizieren.

    Wegen anderer Konzepte - Dunning-Kruger Effekt bist du nicht in der lage zu sehen, wie schlecht deine Aussagen und Schlussfolgerungen sind.

    Es dient hier ausschließlich dazu die Leute im Forum zu nerven. Oder für einen kurzen Moment so zu tun, als hätte man jemanden zu sprechen. Denn wenn du in deiner Realität so auftrittst, wie du dich in den hinderten Foren tust, dann wirst du verdammt wenig Freunde haben.

    Gleichzeitig ist deine Funktion nur zusammengewürfelt irgendwelche Operationen, die wenn ich dich darum bitten würde deine Vorgehensweise in Bezug auf das hier postete zu erkäutern, einfach scheitern wird, weil es nix mit der gegeben Aufgabenstellung zu tun hat.

    My two cents.


Anmelden zum Antworten