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.