AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ziegenproblem

Ein Thema von 0x92 · begonnen am 5. Mär 2014 · letzter Beitrag vom 9. Mär 2014
Antwort Antwort
Seite 1 von 7  1 23     Letzte »    
Benutzerbild von 0x92
0x92

Registriert seit: 14. Feb 2014
6 Beiträge
 
#1

Ziegenproblem

  Alt 5. Mär 2014, 16:34
Delphi-Version: 5
Habs in einem anderen Forum mitbekommen und mich mal darangesetzt.

http://www.zeit.de/2004/48/N-Ziegenproblem

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.

https://github.com/0x92/GoatProblem

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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Ziegenproblem

  Alt 5. Mär 2014, 16:57
Naja und hier mein bisheriger Code dazu. Gibt anscheinend noch einen kleinen Bug denn manchmal gewinnt man obwohl da eine Ziege sein sollte xD
Ganz schlechte Fehlerbeschreibung, insbesondere da das Ergebnis ja zufällig ist. Dein Code sieht eigentlich okay aus.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#3

AW: Ziegenproblem

  Alt 5. Mär 2014, 17:01
Naja und hier mein bisheriger Code dazu. Gibt anscheinend noch einen kleinen Bug denn manchmal gewinnt man obwohl da eine Ziege sein sollte xD
Ganz schlechte Fehlerbeschreibung, insbesondere da das Ergebnis ja zufällig ist. Dein Code sieht eigentlich okay aus.

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.
Ich sehe da atm noch gar keine Gewinnchancen... o.O
00111100001100110010000001000100011001010110110001 1100000110100001101001

Geändert von Back2Code ( 5. Mär 2014 um 17:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ziegenproblem

  Alt 5. Mär 2014, 17:06
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:
Delphi-Quellcode:
    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;
Die CodeFormatierung meint, daß da BEGIN und END fehlen.

Zitat:
Delphi-Quellcode:
    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;
Die Repeat-Until-Schleife kennst du aber?

Delphi-Quellcode:
    repeat
      WriteLn('# NOTE: Only Y/y or N/n accepted');
      ReadLn(Decision);
    until (UpperCase(Decision) = 'Y') or (UpperCase(Decision) = 'N');
Kann es sein, daß da noch eine Schleife fehlt?
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".
$2B or not $2B

Geändert von himitsu ( 5. Mär 2014 um 17:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von 0x92
0x92

Registriert seit: 14. Feb 2014
6 Beiträge
 
#5

AW: Ziegenproblem

  Alt 5. Mär 2014, 17:08
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:
Delphi-Quellcode:
    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;
Die CodeFormatierung meint, daß da BEGIN und END fehlen.

Zitat:
Delphi-Quellcode:
    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;
Die Repeat-Until-Schleife kennst du aber?

Delphi-Quellcode:
    repeat
      WriteLn('# NOTE: Only Y/y or N/n accepted');
      ReadLn(Decision);
    until (UpperCase(Decision) = 'Y') or (UpperCase(Decision) = 'N');
Bisher noch nie eingesetzt...

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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Ziegenproblem

  Alt 5. Mär 2014, 20:43
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:
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;
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.

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.
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Ziegenproblem

  Alt 5. Mär 2014, 21:05
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.
Der Vorteil ist nicht nur mathematisch sondern auch praktisch da, da Du ja am Anfang trotzdem aus 3 Toren wählst. Stell Dir vor, Du hast eine Chance von 1/3 den Gewinn zu bekommen; Wenn jetzt der Quizmaster eins der beiden übrigen Tore öffnet, dann muss er ja das ohne den Gewinn nehmen (außer Du bist von Anfang an Richtig, dass allerdings nur mit der Wahrscheinlichkeit von 1/3). Auf den beiden anderen liegt eine Wahrscheinlichkeit von 2/3 die beim öffnen eines Tores auf das noch geschlossene übertragen wird. Das ist relativ abstrakt, aber grundsätzlich auch praktisch so verwendbar. Interessant wäre jetzt das einige 1000 mal durchzuprobieren um diese These zu prüfen, aber laut heutigem Stand der Wissenschaft würde das schon so sein.
Der Fehler sitzt immer vor dem Computer...
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#8

AW: Ziegenproblem

  Alt 5. Mär 2014, 21:11
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.
Es gibt keine zwei Spiele, sondern die erste (alle bis auf die letzte) Auswahl ist sinnlos. Nur die letzte Auswahl entscheidet über den Gewinn. Daher ist immer die Chance 50:50
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Ziegenproblem

  Alt 5. Mär 2014, 21:50
@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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

AW: Ziegenproblem

  Alt 5. Mär 2014, 22:46
Zitat:
Mikkey: Es gibt keine zwei Spiele, sondern die erste (alle bis auf die letzte) Auswahl ist sinnlos. Nur die letzte Auswahl entscheidet über den Gewinn. Daher ist immer die Chance 50:50.
Popov: Praktisch gibt es keinen Vorteil.
Es gibt keine zwei Spiele, aber die erste Auswahl ist auch nicht sinnlos. Die Chance auf einen Gewinn ist auch nicht 50:50. Und auch praktisch ist es von Vorteil das Tor zu wechseln. (Warum sollte hier ein Unterschied zwischen Theorie und Praxis auftreten??)

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 7  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz