![]() |
Delphi-Version: 5
Ziegenproblem
Habs in einem anderen Forum mitbekommen und mich mal darangesetzt.
![]() Die Ausgangssituation des Ziegenproblems lautet folgendermaßen: Sie sind Kandidat einer Fernsehshow und dürfen eine von drei verschlossenen Türen auswählen. Hinter einer der Türen wartet der Hauptgewinn, ein prachtvolles Auto, hinter den anderen beiden steht jeweils eine meckernde Ziege. Frohgemut zeigen Sie auf eine der Türen, sagen wir Nummer eins. Doch der Showmaster, der weiß, hinter welcher Tür sich das Auto befindet, lässt sie nicht sofort öffnen, sondern sagt geheimnisvoll: »Ich zeige Ihnen mal was!« Er lässt eine andere Tür öffnen, sagen wir Nummer drei – und hinter dieser steht eine Ziege und glotzt erstaunt ins Publikum. Nun fragt der Showmaster lauernd: »Bleiben Sie bei Tür Nummer eins, oder wählen Sie doch lieber Nummer zwei?« Was sollten Sie tun? Dies ist das Ziegenproblem, das im angelsächsischen Sprachraum »Monty Hall Problem« genannt wird. Es geht auf die Spielshow Let's Make a Deal zurück, eine Art amerikanische Variante von Wetten, dass... , die von Monty Hall moderiert wurde und vor allem in den sechziger und siebziger Jahren populär war. Die amerikanische Autorin Marilyn vos Savant, die als Frau mit dem höchsten je gemessenen IQ gilt, stellte das Ziegenproblem im Jahre 1990 in ihrer regelmäßigen Magazin-Kolumne vor und löste damit eine weltweite Debatte aus, die bis heute anhält. ![]() Naja und hier mein bisheriger Code dazu. Gibt anscheinend noch einen kleinen Bug denn manchmal gewinnt man obwohl da eine Ziege sein sollte xD
Delphi-Quellcode:
{ ##############################################################
## Modul: GoatProblem ## Author: 0x92; ## Release: 05.03.2014 ## Contact: 0x92dev@gmail.com | https://github.com/0x92 ## ----------------------------------------------------------- ##############################################################} program GoatProblem; {$APPTYPE CONSOLE} uses SysUtils; {Es soll drei Türen geben. Als erstes wird aus Zufall definiert hinter welcher Tür der Preis liegt. (Auto) Dann soll der Kandidat die erste Wahl treffen(Z.B. Tür 1). Dann Soll eine der anderen Türen aufgedeckt werden, und nun soll der Kandidat sich erneut entscheiden ob er bei seiner Wahl bleibt oder wechselt....} var Doors: array of Integer; i, Doorcount, WinPosition, SelectedDoor, SelectedDoor2, RandomDoor: Integer; Decision: String; // Arraywerte // 0 = Ziege | 1 = Gewinn begin try Randomize; Doorcount := 0; RandomDoor := 0; WriteLn('How many doors should be used for your experiment?'); while Doorcount <= 2 do begin WriteLn; Write('# NOTE: Please use a higher value than 2! '); ReadLn(Doorcount); end; SetLength(Doors, Doorcount); WinPosition := Random(Doorcount); if WinPosition > 0 then WinPosition := WinPosition -1; Doors[WinPosition] := 1; //Gewinn wird auf eine Tür verteilt { 0 0 0 0 1 2} //Nächster Schritt abfragen welche tür genommen werden soll WriteLn; Write('Please submit a door number between 1 and ' + IntToStr(Doorcount) + '. '); ReadLn(SelectedDoor); // SelectedDoor = Die Tür welche ausgewählt wurde WriteLn; WriteLn('You selected door number ' + IntToStr(SelectedDoor) + '.'); while (RandomDoor = SelectedDoor) or (RandomDoor = WinPosition) do //Solange die Zufallstür die ausgewählte/Gewinn Tür ist nochmal neu generieren begin RandomDoor := Random(Doorcount); end; WriteLn('I will show you one goatdoor!'); if Doors[RandomDoor] = 0 then //Wenn das was im Array drinsteht 0 ist vom Index RandomDoor WriteLn('Door number: ' + IntToStr(RandomDoor +1) + ' Ohhh, it is a goat! ;O'); WriteLn('Do you want to change your door?'); WriteLn; Decision := 'None'; while not (Decision = 'Y') and not (Decision = 'y') and not (Decision = 'N') and not (Decision = 'n') do begin WriteLn('# NOTE: Only Y/y or N/n accepted'); ReadLn(Decision); end; if (Decision = 'N') or (Decision = 'n') then //Tür zeigen begin if Doors[SelectedDoor] = 0 then begin WriteLn('Ohhh, it is a goat! ;O You lost the game.'); end else begin WriteLn('WHAT THE FUCK IS GOING ON?? WE GOT A MOTHERFUCKIGN WINNER!!! TAKE YOUR PRICE.'); WriteLn('With that big amount of toilet paper (over 9000) you will never be forced to buy toilet paper again.'); end; end; if (Decision = 'Y') or (Decision = 'y') then //Tür zeigen begin WriteLn('Please submit a door number between 1 and ' + IntToStr(Doorcount) + '.'); ReadLn(SelectedDoor2); // SelectedDoor = Die Tür welche ausgewählt wurde WriteLn('You have selected door number ' + IntToStr(SelectedDoor2) + '.'); if Doors[SelectedDoor2] = 0 then begin WriteLn('Ohhh, it is a goat! ;O You lost the game. Fool! HAHA'); end else begin WriteLn('WHAT THE FUCK IS GOING ON?? WE GOT A MOTHERFUCKIGN WINNER!!! TAKE YOUR PRICE.'); WriteLn('With that big amount of toilet paper (over 9000) you will never be forced to buy toilet paper again.'); end; end; finally ReadLn; end; end. |
AW: Ziegenproblem
Zitat:
Denk' auch dran, dass man seine Gewinnchance nur erhöht (von 33% auf 66%), wenn man die Tür wechselt. Man kann immer noch verlieren. |
AW: Ziegenproblem
Zitat:
|
AW: Ziegenproblem
Warum ist Doors als Integer und nicht als Boolean deklariert?
Und warum wird dieses Array nicht initialisiert? Bist du dir sicher, daß nach dem SetLength alle Integer auf 0 (False) stehen? Zitat:
Zitat:
Delphi-Quellcode:
Kann es sein, daß da noch eine Schleife fehlt?
repeat
WriteLn('# NOTE: Only Y/y or N/n accepted'); ReadLn(Decision); until (UpperCase(Decision) = 'Y') or (UpperCase(Decision) = 'N'); Vorallem Wenn man mehr als 3 Türen vorgibt. Und nicht vergessen, der Moderator darf nur fragen, wenn mehr als 2 Türen noch nicht gewählt wurden, denn ansonsten würde man nie verlieren können, da der Moderator ja alle falschen Türen öffnen würde, mit seinem "ich zeige ihnen mal was". |
AW: Ziegenproblem
Zitat:
Und bzgl. des Arrays...Ich hatte erst ne Schleife drin die alle Elemente auf 0 erstmal setzt hab dann aber beim Debuggen gesehen, dass des sowieso schon passiert und alles auf 0 steht :o |
AW: Ziegenproblem
Ich hab vor einiger Zeit mich auch damit auseinandergesetzt, nur weil ich keinen Vorteil darin sah zu wechseln. Ich hab im Laufe meiner Überlegungen ein halbes Dutzend Programme geschrieben um die These überprüfen. Leider habe ich später in eignen einen Fehler entdeckt, habe es aber versäumt die zu löschen, so dass ich heute nicht mehr weiß welche Programme nun falsch sind.
Hier eines der Programme:
Delphi-Quellcode:
Ich bin selbst heute der Meinung, dass es keinen Vorteil gibt. Ich kenne die mathematische Erklärung. Am Anfang hat man eine 33% Chance auf den Preis. Danach nimmt der Spielleiter ein Tor aus dem Spiel, wobei es immer ein Tor mit einer Ziege ist, so dass nun noch zwei Tore übrig bleiben, eines mit dem Preis und eines mit einer weiteren Ziege. Bei zwei Toren steht die Chance bei 50%. Beim Wechsel hat man nun eine Chance von 66% auf den Preis.
procedure TForm1.Button1Click(Sender: TObject);
const AnzahlSpiele = 1000; var i, Preis, Ziege1, Ziege2, DirektTreffer, WechselTreffer, ErsteWahl, NeueWahl: Integer; begin DirektTreffer := 0; WechselTreffer := 0; Randomize; for i := 1 to AnzahlSpiele do begin //Die Wahl ist eigentlich ein unnötig, man könnte auch 1, 2, 3 nehmen, //aber wir tun mal so //Preis und zwei Ziegen zufällig auf Tore 1, 2 und 3 verteilen Preis := Random(3) + 1; repeat Ziege1 := Random(3) + 1 until Ziege1 <> Preis; repeat Ziege2 := Random(3) + 1 until (Ziege2 <> Preis) and (Ziege2 <> Ziege1); //Erste Wahl des Spielers, bei der er bleibt ErsteWahl := Random(3) + 1; //repeat ErsteWahl := Random(3) + 1 until ErsteWahl <> Ziege1; //Zweite Wahl des Spielers, nach dem Öffnen des Tores mit Ziege1 repeat NeueWahl := Random(3) + 1 until NeueWahl <> Ziege1; //Zählen if ErsteWahl = Preis then Inc(DirektTreffer); //Treffer des Spielers beim nicht Wechsel if NeueWahl = Preis then Inc(WechselTreffer); //Treffer des Spielers beim Wechsel end; ShowMessage(Format('Direkte Treffer: %d, Wechsel Treffer: %d', [DirektTreffer, WechselTreffer])); end; Das Problem ist allerdings, selbst wenn das Programm ein anderes Ergebnis nennt (aber wie gesagt, ich weiß nicht ob es das richtige Ergebnis liefert), dass man schon bei der ersten Wahl die Chance bei 50:50 lag, denn schon von Anfang an war sicher, das eines der Tore mit der Ziege aus dem Spiel genommen wird. Es war also schon von Anfang an die Wahl zwischen dem Preis und einer der Ziegen. Der Vorteil ist somit zwar mathematisch da, weil es im Grunde zwei Spiele gibt, eines mit 33% und eines mit 50%, aber nicht praktisch, weil immer ein Tor mit einer Ziege raus fliegt. |
AW: Ziegenproblem
Zitat:
|
AW: Ziegenproblem
Zitat:
|
AW: Ziegenproblem
@TForm1
Wie schon gesagt, das Problem ist abstrakt. Der Vorteil liegt nur zwischen der Chance des ersten Durchgangs und des zweiten Durchgangs. Ich hab das Spiel beim ersten Fall falsch wiedergegeben. Korrekt lautet die Regel: zuerst hat man die Wahl zwischen drei Toren, also eine Chance von 33% auf den Gewinn. Beim zweiten Durchgang nimmt der Spielleiter vorher ein Tor mit einer Ziege raus und bietet nun den Wechsel des Tors. Nun der korrekte Vorgang: man muss auf jeden Fall wechseln, erst dann hat man die 66% Chance, wechselt man nicht, bleibt die Chance bei 33%. Mathematisch ist alles korrekt und das zweifele ich auch nicht an. Praktisch gibt es keinen Vorteil. Den Grund habe ich schon genannt, eines der Tore mit einer der Ziegen war schon von Anfang an faktisch raus, also nicht wirklich in der Rechnung. |
AW: Ziegenproblem
Zitat:
Vielleicht wird das an einem größeren Beispiel intuitiv klar. Nehmen wir an, wir spielen nicht mit 3 Toren sondern mit 1000. Du suchst dir ein Tor aus, tendenziell erstmal zufällig. Der Quizmaster sagt jetzt "Aha, sie haben also Tor 249 ausgewählt. Ich zeige ihnen mal was..." Und öffnet 998 Tore, hinter jedem ist ein Zonk/Ziege. Es bleiben also genau zwei geschlossen: Deines und ein anderes Tor. (sagen wir mal, Tor 647) Jetzt fragt er dich, ob du wechseln möchtest. Möchtest du? Popov und Mikkey, als Anhänger der "der Firlefanz ist egal, die Chancen sind 50:50" müsste jetzt kommen "Ist eigentlich wurscht." Aber ist es nicht sehr frappierend, dass der Quizmaster genau das Tor 647 geschlossen ließ? In Tor 249 hat man jetzt eine 0,1% Chance auf den Preis, wenn man wechselt hat man eine 99,9% Chance. Das gleiche Prinzip gilt auch für die Fälle mit weniger Toren, auch für 3 Tore. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz