Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht)

Diskutiere Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) im Developer Network Forum im Bereich Hardware & Software Forum; Da der Thread "Programmieraufgaben" nicht sehr weit geführt hat und mir auf Pm's keine Antwort gegeben wurde, eröffne ich einfach mal eine...
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #1
Scorn07

Scorn07

Bekanntes Mitglied
Dabei seit
14.01.2007
Beiträge
253
Reaktionspunkte
0
Da der Thread "Programmieraufgaben" nicht sehr weit geführt hat und mir auf Pm's keine Antwort gegeben wurde, eröffne ich einfach mal eine Aufgabe. Dann zeigt sich wie die Interessenslage ist.

Aufgabe :
Programmiersprache: egal
Schwierigkeit: leicht

Problem:

Bei einer Spielshow soll der Kandidat eines von drei aufgebauten Toren auswählen. Hinter einem verbirgt sich der Gewinn, ein Auto, hinter den anderen beiden jeweils eine Ziege, also Nieten (oder Trostpreise). Folgender Spielablauf ist immer gleich und den Kandidaten vorab bekannt:

1. Der Kandidat wählt ein Tor aus, welches aber vorerst verschlossen bleibt.
2. Daraufhin öffnet der Moderator, der die Position des Gewinns kennt, eines der beiden nicht vom Kandidaten ausgewählten Tore, und zwar eines, hinter dem sich eine Ziege befindet. Im Spiel befinden sich also noch ein Gewinn und eine Niete.
3. Der Moderator bietet dem Kandidaten an, seine Entscheidung zu überdenken und das andere Tor zu wählen.

Wie soll der Kandidat sich entscheiden, um seine Gewinnchance zu maximieren?
Quelle: wikipedia

Die richtige Entscheidung ist zu wechseln, denn dann beträgt die Gewinnchance 2/3 .
Beweise es, indem du ein Programm schreibst das dieses Szenario simuliert ! In dem Programm wechselt der "Kandidat" immer das Tor. Das Programm muss das Szenario sehr oft ausführen (nach dem "Gesetz der großen Zahlen" je öfter desto besser) und danach eine Gewinn/ Verlust - Statistik anzeigen.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #2
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Werde das mal ausprobieren. Bin gerade dabei, C# zu lernen.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #3
N

Nolath

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
1.121
Reaktionspunkte
1
Ich habe es mal in Visual Basic umgesetzt.

Gibt bestimmt bessere Möglichkeiten als die, die ich gewählt habe :D

ziegenproblemcp2.jpg


Und hier der Downloadlink.

Soll ich den Code auch noch posten?

Den Projektordner lade ich aus Zeitgründen jetzt nicht hoch, aber ihr könnt ihn bei mir in ICQ [200-027-778] anfragen.

Kann sein, dass ich auch noch Fehler im Programm habe...
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #4
Scorn07

Scorn07

Bekanntes Mitglied
Dabei seit
14.01.2007
Beiträge
253
Reaktionspunkte
0
Der Code wär super... darum gehts ja eigentlich....

Ps: Dein Ergebnis stimmt nicht ganz. Es müssten ~67 % Gewinne und ~33% Verluste sein.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #5
GIGX

GIGX

Bekanntes Mitglied
Dabei seit
16.04.2004
Beiträge
1.511
Reaktionspunkte
0
Ort
Helion Prime
c++ code wär net schlecht.. :)
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #6
N

Nolath

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
1.121
Reaktionspunkte
1
Der Code wär super... darum gehts ja eigentlich....

Ps: Dein Ergebnis stimmt nicht ganz. Es müssten ~67 % Gewinne und ~33% Verluste sein.

Habe mich auch schon gewundert.

Ich versuche den Fehler noch zu finden.

Mit dem Code habe ich nachgefragt weil es keine Code-Tags zum ein-/ausblenden gibt.

Wenn ich jetzt einen "normalen" Code-Tag verwende, kann es leicht passieren, dass man unfreiwilig den Code liest...
Verwende ich einen Spoiler ist das lesen des Codes umständlich...
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #7
N

Nolath

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
1.121
Reaktionspunkte
1
Problem gelöst.

Ich hatte erst geprüft ob die anderen Türen Gewinne sind und wenn sie es sind wurden sie genommen (dann muss die jeweils andere Tür ja die geöffnete Niete sein).
Aber tatsächlich sollte das Programm nur testen, ob eine Tür der Gewinn ist und wenn nicht die andere nehmen...

However, der Fehler ist behoben und es funzt jetzt :D

//Edit:
Auf meinem Webspace liegt jetzt die aktuelle Version
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #8
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

Wenn ich jetzt einen "normalen" Code-Tag verwende, kann es leicht passieren, dass man unfreiwilig den Code liest...
Verwende ich einen Spoiler ist das lesen des Codes umständlich...

Pack den Quellcode doch in ein Archiv und poste den Link. Details können dann hier im Thread bei Bedarf gepostet und diskutiert werden.

Nic
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #9
N

Nolath

Bekanntes Mitglied
Dabei seit
23.10.2006
Beiträge
1.121
Reaktionspunkte
1
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #10
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
So in etwa sieht meine Java-Lösung auch aus. Allerdings habe ich den großen IF-Block weggelassen, da die Entscheidung, ob der Kandidat gewinnt oder verliert, ja schon direkt nach seiner Wahl des Tores gefallen ist.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #11
VB-1

VB-1

Bekanntes Mitglied
Dabei seit
07.12.2006
Beiträge
120
Reaktionspunkte
0
So in etwa sieht meine Java-Lösung auch aus. Allerdings habe ich den großen IF-Block weggelassen, da die Entscheidung, ob der Kandidat gewinnt oder verliert, ja schon direkt nach seiner Wahl des Tores gefallen ist.


Tach:)

Ist die ausführbar?
Schreib mal den Link für das Java-Progie. hier rein.

Mfg:hal:
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #12
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Ich hab das .class-File mit dazugepackt. Einfach eine Konsole in dem betreffenden Verzeichnis öffnen und dann "java Main" eingeben.
 

Anhänge

  • Main.rar
    1,3 KB · Aufrufe: 22
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #13
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
falsch gepostet... sorry.

Gruss, FFNB.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #14
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Bin jetzt auch fertig geworden, allerdings generiert mir Random.Next(3) immer eine gleiche Zufallszahl - natürlich nicht beim Debuggen mit verzögerter Ausführung. Da zwei mal eine Zufallszahl generiert werden muss (einmal für den Gewinn, dann für die Kandidatenauswahl), verliert der Kandidat zu 99,999 %. :lol:
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #15
Wesley Pipes

Wesley Pipes

Bekanntes Mitglied
Dabei seit
26.07.2002
Beiträge
74
Reaktionspunkte
0
Ort
Nämberch
Du hast vergessen den Zufalls Generator zu initialisieren^^

Bei C++ wars die Zeile:

srand((unsigned)time(NULL));


Schau mal in deine Hilfe. dann gehts auch zur Laufzeit :)


Mfg Wes



Edit: Ups seh grad das der Thread ja gar nicht mehr frisch ist^^ Mittlerweile hastes ja selber schon rausgefunden :D
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #16
WinTVDVBs

WinTVDVBs

Bekanntes Mitglied
Dabei seit
28.05.2001
Beiträge
749
Reaktionspunkte
0
Ort
Erfurt
Die richtige Entscheidung ist zu wechseln, denn dann beträgt die Gewinnchance 2/3 .

Wieso eigentlich? Wenn der Moderator das nicht gewählte Tor öffnet (und kein Gewinn drin ist), dann ist die Wahrscheinlichkeit auf den Gewinn anschließend IMMER 50%, egal welches Tor ich nehme. Denn dann handelt es sich um ein neues Spiel und Zufallsereignisse haben bekanntlich kein "Gedächtnis". Will sagen, es macht keinen Unterschied, ob man erst aus 3 Toren ein nichtgewähltes aufmacht und dann zwischen den anderen beiden entscheidet ODER ob man von Anfang an nur 2 Tore zur Auswahl hat.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #17
WinTVDVBs

WinTVDVBs

Bekanntes Mitglied
Dabei seit
28.05.2001
Beiträge
749
Reaktionspunkte
0
Ort
Erfurt
Nachtrag (Edit geht leider nicht mehr :error: )
Es ist tatsächlich eine 50% Chance. Nehmen wir einmal an, der Gewinn sei hinter Tor 3. Nun gibt es 4 (NICHT 3!) Möglichkeiten:
1) Der Kandidat wählt Tor 1. Der Moderator muss nun Tor 2 öffnen (denn 1 hat der Kandidat gewählt und 3 enthält den Gewinn). Wechselt der Kandidat dann von Tor 1 auf Tor 3, GEWINNT er.
2) Der Kandidat wählt Tor 2. Der Moderator muss nun Tor 1 öffnen (denn 2 hat der Kandidat gewählt und 3 enthält den Gewinn). Wechselt der Kandidat dann von Tor 2 auf Tor 3, GEWINNT er.
ABER (jetzt kommts!) - wenn der Kandidat am Anfang richtig tippt, hat der Moderator die Wahl zwischen 2 Toren, die er öffnen kann:
3) Der Kanditat wählt Tor 3. Der Moderator öffnet Tor 1. Wechselt der Kandidat dann zu Tor 2, VERLIERT er.
4) Der Kanditat wählt Tor 3. Der Moderator öffnet Tor 2. Wechselt der Kandidat dann zu Tor 1, VERLIERT er.

Von den 4 Fällen gibt es also 2 Gewinn- und 2 Verlustfälle. Dasselbe gilt analog für die Fälle, dass der Gewinn in Tor 1 oder Tor 2 ist. Durch die Möglichkeit des Moderators, im Falle eines Richtigratens seitens des Kandidaten 2 Tore zur Auswahl zu haben, verschlechtert sich die Gewinnchance im Falle des Wechselns von 2/3 auf 2/4, also genau 1/2 bzw. 50%.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #18
Scorn07

Scorn07

Bekanntes Mitglied
Dabei seit
14.01.2007
Beiträge
253
Reaktionspunkte
0
Nachtrag (Edit geht leider nicht mehr :error: )
Es ist tatsächlich eine 50% Chance. Nehmen wir einmal an, der Gewinn sei hinter Tor 3. Nun gibt es 4 (NICHT 3!) Möglichkeiten:
1) Der Kandidat wählt Tor 1. Der Moderator muss nun Tor 2 öffnen (denn 1 hat der Kandidat gewählt und 3 enthält den Gewinn). Wechselt der Kandidat dann von Tor 1 auf Tor 3, GEWINNT er.
2) Der Kandidat wählt Tor 2. Der Moderator muss nun Tor 1 öffnen (denn 2 hat der Kandidat gewählt und 3 enthält den Gewinn). Wechselt der Kandidat dann von Tor 2 auf Tor 3, GEWINNT er.
ABER (jetzt kommts!) - wenn der Kandidat am Anfang richtig tippt, hat der Moderator die Wahl zwischen 2 Toren, die er öffnen kann:
3) Der Kanditat wählt Tor 3. Der Moderator öffnet Tor 1. Wechselt der Kandidat dann zu Tor 2, VERLIERT er.
4) Der Kanditat wählt Tor 3. Der Moderator öffnet Tor 2. Wechselt der Kandidat dann zu Tor 1, VERLIERT er.

Von den 4 Fällen gibt es also 2 Gewinn- und 2 Verlustfälle. Dasselbe gilt analog für die Fälle, dass der Gewinn in Tor 1 oder Tor 2 ist. Durch die Möglichkeit des Moderators, im Falle eines Richtigratens seitens des Kandidaten 2 Tore zur Auswahl zu haben, verschlechtert sich die Gewinnchance im Falle des Wechselns von 2/3 auf 2/4, also genau 1/2 bzw. 50%.

Punkt 3 und 4 sind eigentlich ein Punkt. Du vermischt hier die Wahl des Kandidaten mit der Wahl des Moderators.
Denn der Kandidat wählt Tor 3, ob der Moderator jetzt Tor 1 oder 2 öffnet ist völlig egal. Dazu eine nette Grafik von Wikipedia : http://de.wikipedia.org/wiki/Bild:Entscheidungsbaum_Ziegenproblem.svg

Eine sehr schöne Erklärung (meiner Meinung nach)
Eine Million Tore

Das Ziegenproblem lässt sich auch erklären, indem man die Situation überspitzt. Es gibt dann eine Million Tore und hinter genau einem befindet sich das Auto. Nachdem der Kandidat ein Tor gewählt hat, öffnet der Moderator alle anderen Tore bis auf eines. Hier ist es sofort einsichtig, dass der Kandidat wechseln sollte: die Wahrscheinlichkeit mit dem zuerst gewählten Tor richtig zu liegen ist sehr gering. Wenn man die Zahl der Tore verringert ändert sich nichts daran, dass der Kandidat das Tor wechseln sollte, nachdem der Moderator alle bis auf eine Niete entfernt hat. Insbesondere gilt dies auch für den Fall mit drei Toren.
wikipedia.de


Ps: Außerdem haben wir hier Programme gebastelt, die eindeutig beweisen, dass es so ist.
 
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #19
Data

Data

Bekanntes Mitglied
Dabei seit
01.04.2006
Beiträge
399
Reaktionspunkte
0
Edit: Ups seh grad das der Thread ja gar nicht mehr frisch ist^^ Mittlerweile hastes ja selber schon rausgefunden :D
Nein, ich habe es erst mal liegenlassen.

Du hast vergessen den Zufalls Generator zu initialisieren^^

Bei C++ wars die Zeile:

srand((unsigned)time(NULL));


Schau mal in deine Hilfe. dann gehts auch zur Laufzeit :)


Mfg Wes
Die Randomize-Funktion (void, kein Referenzparameter) wirkt sich laut Dokumentation nur auf die Rnd-Funktion aus. Bei deiner Zeile handelt es sich wohl um eine unverwaltete Methode. Da ich Microsoft Visual C# Express einsetze, erfolgt Methodenzugriff über .NET.
Nolath benutzt auch keine Initialisierung und bei ihm scheint es offenbar zu funktionieren.
 
Zuletzt bearbeitet:
  • Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht) Beitrag #20
WinTVDVBs

WinTVDVBs

Bekanntes Mitglied
Dabei seit
28.05.2001
Beiträge
749
Reaktionspunkte
0
Ort
Erfurt
Ps: Außerdem haben wir hier Programme gebastelt, die eindeutig beweisen, dass es so ist.

Das ist doch kein Beweis. Wer etwas beweisen will, wird einen Programmalgorithmus benutzen, der genau das (scheinbar) beweist. Wenn man den falschen Algorithmus verwendet, liefert das Programm natürlich das falsche (erwünschte) Ergebnis. Ohne mich auf eine Programmiersprache festzulegen, hier der meiner Meinung nach richtige Algorithmus:

-Gewinntor = RND(3)
-Kandidatentor_alt = RND(3)
-WENN Gewinntor UNGLEICH Kandidatentor -> Moderatortor = Übrigbleibendes
-SONST Moderatortor = RND(eines der beiden möglichen Übrigen)
-Kandidatentor_neu = Übrigbleibendes (also NICHT Kandidatentor_alt und NICHT Moderatortor)
-if Gewinntor GLEICH Kandidatentor_neu -> Gewinn++ SONST Verlust++

Damit würden sich Gewinn und Verlust - wie nicht anders zu erwarten - die Waage halten.
Zu der Million Tore: Nachdem 999.998 Tor geöffnet sind, ist es wieder ein neues Spiel mit genau 2 Toren, also 50% Wahrscheinlichkeit. Nochmal: Zufallsereignisse haben kein Gedächtnis. Die Wahrscheinlichkeit, dass nächsten Samstag dieselben Lottozahlen gezogen werden wie letzte Woche ist genausohoch wie die für die Zahlen 1,2,3,4,5,6 oder jede andere Kombi.
 
Thema:

Programmieraufgabe: Das Ziegenproblem (Schwierigkeit: leicht)

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben