Thema: Delphi Ziegenproblem

Einzelnen Beitrag anzeigen

Benutzerbild von 0x92
0x92

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

Ziegenproblem

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