Einigen wird das Ziegenproblem sicherlich ein Begriff sein.
Kurz zusammengefasst: In einer Spielshow gibt es 3 Türen. Hinter einer steht ein Auto und hinter den anderen eine Ziege.
Der Spieler muss sich am Anfang für eine Tür entscheiden. Dann öffnet der Moderator eine falsche Tür mit einer Ziege.
Übrig bleiben also noch 2 Türen. Ist die Wahrscheinlichkeit zu gewinnen für den Spieler gleich hoch bei beiden Türen oder sollte er lieber die Tür noch einmal wechseln?
Ergebnis: Er hat doppelt so hohe Gewinnchancen wenn er die Tür wechselt.
Das Verzwackte an dem Problem ist, dass es uns intuitiv nicht ganz einleuchtet. Unserer Denkweise ist so in der Art: Ok. - 2 Türen - eine falsch - eine richtig - also fifty-fifty-Chance.
Etwas deutlicher wird es dann bei mehr Türen. Also es gibt 100 Türen, der Moderator öffnet dann 98 falsche Türen und dann wird eher klar, warum die noch verbleibende Tür eher die richtige Tür ist.
Um sich das noch ein bisschen anschaulicher zu machen habe ich die kurze Weihnachtspause genutzt und noch ein kleines Skript hierzu gemacht:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
#Region GUI
$gForm = GUICreate("Ziegenproblem empirisch", 475, 165, 192, 124)
GUICtrlCreateGroup("Bei der ersten Wahl geblieben", 8, 40, 217, 89)
GUICtrlCreateLabel("Wie oft gewonnen?:", 16, 64, 100, 17)
GUICtrlCreateLabel("Gewinnwahrscheinlichkeit:", 12, 95, 130, 17)
$giNGewinneGeblieben = GUICtrlCreateInput("", 152, 64, 65, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT))
$giWarschGeblieben = GUICtrlCreateInput("", 152, 93, 65, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT))
GUICtrlCreateGroup("Tür noch einmal gewechselt", 240, 40, 225, 89)
GUICtrlCreateLabel("Wie oft gewonnen?:", 256, 64, 100, 17)
$giNGewinneGewechselt = GUICtrlCreateInput("", 382, 63, 65, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT))
GUICtrlCreateLabel("Gewinnwahrscheinlichkeit:", 247, 94, 130, 17)
$giWarschGewechselt = GUICtrlCreateInput("", 382, 92, 65, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT))
GUICtrlCreateGroup("", -99, -99, 1, 1)
$giAnzTueren = GUICtrlCreateInput("3", 80, 8, 49, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT))
GUICtrlCreateLabel("Anzahl Türen", 8, 8, 67, 17)
GUICtrlCreateLabel("Anzahl Durchläufe", 136, 8, 91, 17)
$giAnzDurchlaeufe = GUICtrlCreateInput("1000", 232, 8, 57, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_RIGHT))
$giGewinnverhaeltnis = GUICtrlCreateInput("", 184, 136, 97, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
GUICtrlCreateLabel("Gewinnverhältnis", 88, 136, 85, 17)
$iBStart = GUICtrlCreateButton("Start", 344, 8, 121, 25)
GUICtrlSetOnEvent($iBStart, "StartCalculation")
GUISetOnEvent($GUI_EVENT_CLOSE, "raus")
GUISetState(@SW_SHOW)
#EndRegion GUI
; Endlosschleife
While 1
Sleep(100)
WEnd
Func raus()
Exit
EndFunc
Func StartCalculation()
Local $dDurchlaeaufe = GUICtrlRead($giAnzDurchlaeufe)
If $dDurchlaeaufe < 1 Or $dDurchlaeaufe > 1e6 Then Return MsgBox(48, "Fehler", "Anzahl Durchläufe ist nicht im richtigen Wertebereich")
Local $dAnzahlTueren = GUICtrlRead($giAnzTueren)
If $dAnzahlTueren < 3 Or $dAnzahlTueren > 1e6 Then Return MsgBox(48, "Fehler", "Anzahl Türen ist nicht im richtigen Wertebereich")
Local $aResults = _ZiegenProblemEmpirisch($dDurchlaeaufe, $dAnzahlTueren)
GUICtrlSetData($giNGewinneGeblieben, $aResults[0])
GUICtrlSetData($giNGewinneGewechselt, $aResults[1])
GUICtrlSetData($giWarschGeblieben, Round($aResults[3] * 100, 1) & " %")
GUICtrlSetData($giWarschGewechselt, Round($aResults[4] * 100, 1) & " %")
GUICtrlSetData($giGewinnverhaeltnis, "1 : " & Round ($aResults[2], 1))
EndFunc
Func _ZiegenProblemEmpirisch($dDurchlaeaufe, $dTueren)
Local $iKorrekteTuer, _
$iGewaehlteTuer, _
$iKorrektWennGeblieben = 0, _
$iKorrektWennGewechselt = 0
For $i = 1 To $dDurchlaeaufe
$iKorrekteTuer = Random(1, $dTueren, 1)
$iGewaehlteTuer = Random(1, $dTueren, 1)
If $iKorrekteTuer = $iGewaehlteTuer Then
$iKorrektWennGeblieben += 1
Else
$iKorrektWennGewechselt += 1
EndIf
Next
Local $aRet[5] = [$iKorrektWennGeblieben, $iKorrektWennGewechselt, $iKorrektWennGewechselt / $iKorrektWennGeblieben, $iKorrektWennGeblieben / $dDurchlaeaufe, $iKorrektWennGewechselt / $dDurchlaeaufe]
Return $aRet
EndFunc ;==>_ZiegenProblemEmpirisch
Alles anzeigen