Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Ziegenproblem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.11.2010, 21:15 Uhr
~PrivateArms
Gast


Hey Leute,
ich schreibe gerade einen Simulator für das Ziegenproblem:
"Angenommen Sie befinden sich in einer Spielshow und haben die Wahl zwischen drei Toren. Hinter einem Tor ist ein Auto, hinter den anderen sind Ziegen. Das Auto und die Ziegen sind vor der Show zufällig hinter die Tore verteilt worden. Die Regeln der Spielshow sind folgende: Nachdem Sie ein Tor gewählt haben bleibt dieses zunächst geschlossen. Der Showmaster Monty Hall, der weiß was sich hinter den Toren befindet, muss nun eine der beiden verbleibenden Tore öffnen, und hinter dem von ihm geöffneten Tor muss sich eine Ziege befinden. Wenn hinter beiden verbleibenden Toren jeweils eine Ziege steht, öffnet er eines der beiden Tore zufällig. Nachdem Monty Hall ein Tor mit einer Ziege geöffnet hat fragt er Sie, ob Sie bei Ihrer ersten Wahl bleiben oder zum letzten verbleibenden Tor wechseln möchten. Nehmen Sie an Sie wählen Tor 1 und der Showmaster öffnet Tor 3 mit einer Ziege. Er fragt Sie dann: „Möchten Sie zu Tor 2 wechseln?“ Ist es zu Ihrem Vorteil, Ihre Wahl zu ändern?"
Mein Problem ist es, dass mein Algorythmus gegen die REgel verstößt, das er immer das/die Tor/Tore öffnet, die noch geschloßen, vom Spieler auch noch nicht gewählt worde sind und hinter denen kein Auto ist.
DAfür benutze ich folgenden Code:

Code:
DoorOpen = false;
for (int i = 0; i < testrow.DoorsToOpen; i++)
    {
        while (!DoorOpen)                // Showmaster oeffnet Tueren
        {
            DoorToOpen = rand() % testrow.countDoors;
            if (!doors[DoorToOpen].selected && doors[DoorToOpen].closed && doors[DoorToOpen].Inhalt != car)
            {
                DoorOpen = true;
                doors[DoorToOpen].closed = false;
            }
        }
        DoorOpen = false;
    }



eine andere fehlerquelle könnte in der auswahl des zweiten tores liegen. DEr code dafür:

Code:
DoorOpen = false;
while (!DoorOpen)                                  // Zweite Tuer auswaehlen
    {
        DoorToOpen = rand() % testrow.countDoors;
        if (DoorToOpen != testrow.selectedDoor1 && doors[DoorToOpen].closed)
        {
            testrow.selectedDoor2 = DoorToOpen;
            doors[DoorToOpen].selected = true;
            DoorOpen = true;
        }
    }



Könnt ihr mir sagen wo er Fehler liegt, oder habt ihr einen anderen Vorschlag, wie ich das Auswahlverfahren gestalten könnte?

Hier nochmal der komplette Code(falls es hilft):

Code:
// Ziegenproblem Simulator 0.1
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

// Deklarationen

enum content {goat, car};                                                      

struct GarageDoor
{
    enum content Inhalt;
    bool closed;
    bool selected;
};

struct Experiment
{
    int attempts;
    int number;                                                                 // Index des Versuchs, Anzahl der Versuche
    short countDoors;
    short DoorsToOpen;
    short CarDoor;                                                              // Index (0-2) des Tores mit Auto
    short selectedDoor1, selectedDoor2;                                         // Ausgewaehltes Tor vor, nach Wechsel
    int rightWC;                                                                // Anzahl aller richtigen Auswahlen nach Wechsel
    int rightNC;                                                                // Anzahl aller richtigen Auswahlen ohne Wechsel
    int wrongs;                                                                 // Anzahl aller falschen Auswahlen
    bool rightWithChange;
    bool rightNoChange;
    bool wrong;
};    

struct GarageDoor* simulation_init(struct Experiment &testrow, short countDoor, short DoorsToOpen, int attempts);
void simulation_run(struct Experiment &testrow, struct GarageDoor *doors);

//
int main(int argc, char** argv)
{
    struct GarageDoor *doors;
    struct Experiment attempt;
    doors = simulation_init(attempt, 3, 1, 10);
    srand(8895);
    while (true){
    simulation_run(attempt, doors);
    cout << attempt.selectedDoor1 << " " << attempt.selectedDoor2 << " " << attempt.CarDoor << endl;
    for (int i = 0; i < attempt.countDoors; i++)
    {
        /*simulation_run(attempt, doors);
        cout << attempt.CarDoor << endl << attempt.selectedDoor1 << endl << attempt.selectedDoor2 << endl;
        getchar();*/
        cout  << doors[i].Inhalt << " " << doors[i].selected << " " << doors[i].closed << endl;
    }
    getchar();
}
    cout << endl << endl << attempt.rightWC/attempt.attempts << endl << attempt.rightNC/attempt.attempts << endl << attempt.wrongs;
    
    getchar();
}

// Definitionen

struct GarageDoor* simulation_init(struct Experiment &testrow, short countDoor, short DoorsToOpen, int attempts)// voraussichtlich richtig
{
    GarageDoor* doors = 0;
    testrow.attempts = attempts;
    testrow.number = 0;
    testrow.CarDoor = 0;
    testrow.selectedDoor1 = testrow.selectedDoor2 = 0;
    testrow.rightWC = testrow.rightNC = 0;
    testrow.wrongs = 0;
    testrow.rightWithChange = testrow.rightNoChange = testrow.wrong = false;
    
    if (3 > countDoor)
    {
        countDoor = 3;
        DoorsToOpen = 1;
        testrow.countDoors = countDoor;
        testrow.DoorsToOpen = DoorsToOpen;
    }
    else if (1000 < countDoor)
    {
        countDoor = 1000;
        testrow.countDoors = countDoor;
        if (DoorsToOpen < countDoor - 1 && DoorsToOpen >= 1)
        {
            testrow.DoorsToOpen = DoorsToOpen;
        }
        else
        {
            DoorsToOpen = 1;
            testrow.DoorsToOpen = DoorsToOpen;
        }
    }
    else
    {
        testrow.countDoors = countDoor;
        if (DoorsToOpen < countDoor - 1 && DoorsToOpen >= 1)
        {
            testrow.DoorsToOpen = DoorsToOpen;
        }
        else
        {
            DoorsToOpen = 1;
            testrow.DoorsToOpen = DoorsToOpen;
        }
    }
    
    doors = new GarageDoor[countDoor];
    return doors;
}

void simulation_run(struct Experiment &testrow, struct GarageDoor *doors)
{
    bool DoorOpen = false;
    short DoorToOpen;
    for (int i = 0; i < testrow.countDoors; i++)
    {
        doors[i].closed = true;
        doors[i].selected = false;
        doors[i].Inhalt = goat;
    }
    doors[rand()%testrow.countDoors].Inhalt = car;                              // Auto wird hinter einer Tuer versteckt
    testrow.selectedDoor1 = rand() % testrow.countDoors;                        // Spieler waehlt ein Tor aus
    doors[testrow.selectedDoor1].selected = true;
    /*if (doors[testrow.selectedDoor1].Inhalt == car)
    {
        testrow.rightNC++;
        testrow.number++;
        testrow.rightNoChange = true;
        return;
    }*/
    for (int i = 0; i < testrow.DoorsToOpen; i++)
    {
        while (!DoorOpen)                                                       // Showmaster oeffnet Tueren
        {
            DoorToOpen = rand() % testrow.countDoors;
            if (!doors[DoorToOpen].selected && doors[DoorToOpen].closed && doors[DoorToOpen].Inhalt != car)
            {
                DoorOpen = true;
                doors[DoorToOpen].closed = false;
            }
        }
        DoorOpen = false;
    }
    while (!DoorOpen)                                                           // Zweite Tuer auswaehlen
    {
        DoorToOpen = rand() % testrow.countDoors;
        if (DoorToOpen != testrow.selectedDoor1 && doors[DoorToOpen].closed)
        {
            testrow.selectedDoor2 = DoorToOpen;
            doors[DoorToOpen].selected = true;
            DoorOpen = true;
        }
    }
      if (doors[testrow.selectedDoor1].Inhalt == car)
    {
        testrow.rightNC++;
        testrow.number++;
        testrow.rightNoChange = true;
        return;
    }
    else if (doors[testrow.selectedDoor2].Inhalt == car)
    {
        testrow.rightWC++;
        testrow.number++;
        testrow.rightWithChange = true;
        return;
    }
    else
    {
        testrow.wrongs++;
        testrow.number++;
        testrow.wrong = true;
        return;
    }
}    


Vielen Dank schon mal für eure Mühe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.12.2010, 18:06 Uhr
TOSHMAX



Das Problem ist, dass der Kandidat bei deinem Code immer gewinnt. Das liegt denke ich bei der 2. Auswahl des Tores. Er sucht nach einem Tor, dass noch geschlossen ist und nicht die erste Wahl war. Und da bereits ein Tor mit Ziege geöffnet ist, bleiben 2 Auswahlen und davon ist natürlich immer in einem das Auto.

Zusätzlich sind auch einige Variablen in deinem Code, die du nur setzt und zu sonst nichts verwendest. Ich würde dir vorschlagen den gesamten Code nochmal zu überarbeiten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.12.2010, 19:44 Uhr
~f.-th.
Gast


http://de.wikipedia.org/wiki/Ziegenproblem

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: