Ziegenproblem - Denkfehler?



  • Hallo,

    ich habe ein Programm geschrieben, welches sich mit dem Ziegenproblem befasst.
    Es soll Bewiesen werden, dass das 'Wechseln' der Tür am klügsten ist.
    Nun zu meinem Problem, wenn das Programm 9.000.000.000 Versuche durchführt erhalte ich eine Erfolgsquote von ~66%. Bei 10.000.000.000 Versuchen ist die Erfolgsquote jedoch nurnoch 16%... wor könnte mein Denkfehler liegen?

    PS: Mein Coding-Style ist nicht wirklich der beste, könnt mir ja Verbesserungsvorschläge geben.

    #include <iostream>
    #include <cstdlib>
    #include <time.h>
    using namespace std;

    int main()
    {
        srand(time(0));
        long int versuche = 0;
        float erfolge = 0;
        int auto1;
        int tor[3];
        int wahl;
    
        while (versuche < 10000000)
        {
            auto1 = rand()%3+1; // Tor mit Auto wird ausgesucht
    
            for (int i = 1; i < 3; i++) // Tore einrichten
            {
                tor[i] = 0;
                if (i == auto1)
                {
                    tor[i] = 1;
                }
            }
    
            wahl = rand()%3+1; //Tor-Wahl generieren
    
            for (int i = 1; i < 3; i++) // Tor "oeffnen"
            {
                if (i != wahl && tor[i] != 1)
                {
                    tor[i] = 2;
                }
            }
    
            for (int i =1;i < 3;i++) // Tor wechseln
            {
                if (tor[i] != 2 && i != wahl)
                {
                    wahl = i;
                }
            }
    
            if (wahl == auto1) // Erfolg auswerten
            {
                erfolge++;
            }
    
            versuche++;
        }
    
        cout << "Versuche: " << versuche << endl;
        cout << "Erfolg in Prozent: " << erfolge*100/versuche << "%" << endl;
        cin  >> erfolge;
    
    return 0;
    }
    

    Grüße,
    Ziege



  • PS: Mein Coding-Style ist nicht wirklich der beste, könnt mir ja Verbesserungsvorschläge geben.

    Alle Variablen so lokal wie möglich machen.
    Ist der Fehler noch da, wenn Du mit double oder mit long long zählst?



  • Alle Variablen so lokal wie möglich machen.
    Ist der Fehler noch da, wenn Du mit double oder mit long long zählst?

    Tatsächlich, lag an der Variable 'erfolge' double statt float und der Fehler ist behoben. War die Ganze Zeit überzeugt, es würde an der Variable 'versuche' liegen...

    Danke volkard



  • Wieso ist die Anzahl von Erfolgen eine Fließkommazahl.

    Wenn Du etwas im Stil verbessern möchtest, würde ich als erstes mal Anfangen die Zustände der Tore (0,1,2) in irgendetwas lesbares zu kapseln. Und dann sehen, ob du auf ein paar Schleifen verzichten kannst.
    for (int i = 1; i < 3; i++) läuft übrigens nur durch tor1-2. Das erste Tor ist tor[0].



  • Die Variable 'erfolge' ist eine Fließkommazahl, damit die Prozentangabe später mit Nachkommastellen angezeigt wird.


  • Mod

    Ziege schrieb:

    Die Variable 'erfolge' ist eine Fließkommazahl, damit die Prozentangabe später mit Nachkommastellen angezeigt wird.

    Keine gute Idee. Die Anzahl der Erfolge ist naturgemäß ganzzahlig* und das sollte in einem Programm daher auch so repräsentiert werden. Wenn du an irgendeiner Stelle Ausgabe als Kommazahl haben willst, dann rechne an dieser Stelle in eine Kommazahl um anstatt dein ganzes Programm damit zu belasten. Umrechnen kann man dies entweder direkt durch einen static_cast auf double oder indirekt durch die Tatsache, dass Multiplikation und Division mit einer Fließkommazahl wieder in einer Fließkommazahl resultieren:

    // Beispielsweise so:
    cout << "Erfolg in Prozent: " << erfolge*100.0/versuche << "%" << endl; // 100 ist nun ein double -> Ergebnis ist auch ein double
    // Oder so:
    cout << "Erfolg in Prozent: " << static_cast<double>(erfolge)*100/versuche << "%" << endl; // erfolge wird als double aufgefasst -> Ergebnis ist auch ein double
    

    *: Und immer positiv! Also unsigned Datentyp nehmen.


Anmelden zum Antworten