Ich war noch nie in der Lage, mich mit dem Monty Hall-Problem zu befassen . Hier ist die Prämisse:
Angenommen, Sie sind in einer Spielshow und haben die Wahl zwischen drei Türen: Hinter einer Tür steht ein Auto; hinter den anderen Ziegen. Sie wählen eine Tür, sagen Sie Nr. 1, und der Gastgeber, der weiß, was sich hinter den Türen befindet, öffnet eine weitere Tür, sagen Sie Nr. 3, die eine Ziege hat. Dann sagt er zu Ihnen: "Wollen Sie Tür Nr. 2 öffnen?" Ist es zu Ihrem Vorteil, Ihre Wahl zu ändern?
Führen Sie 10.000 Simulationen aus. Geben Sie den Gewinnprozentsatz der Umschaltung aus. Zum Beispiel:
> 66.66733%
Antworten:
JavaScript 52
Türen sind 1: [0,1 / 3), 2: [1 / 3,2 / 3), 3: [2/3, 1)
Angenommen, der Preis befindet sich immer in Tür 3. Wenn der Gast die Türen 1 oder 2 auswählt, was dem Bereich [0,2 / 3] entspricht, und wechselt, hat er den Preis gewonnen.
quelle
i=s=0;s+=Math.random()<2/3while i++<1e4;alert s/100
J:
1715Es wählt eine zufällige Tür aus - beschriften wir diese 0, 1 oder 2, wobei 2 die Tür mit dem Auto ist - und berechnet den Vorteil des Schaltens basierend auf dieser Logik:
1
).1
).0
) , wenn er wechselt .Anschließend wird das Ergebnis als Summe des vorherigen Arrays geteilt durch 100 berechnet.
Ich bin ziemlich wackelig mit J, also bin ich sicher, dass dies weiter verbessert werden könnte.
quelle
R
115100Die Pseudosimulationsantwort ist 23 Zeichen lang:
aber hier ist eine tatsächliche Simulation:
D
sind die möglichen TürenS
ist eine Funktion zum zufälligen Auswählen eines Elements aus einem VektorC
ist die Tür mit dem Auto (zufällig unterD
)P
ist die vom Spieler gewählte Tür (zufällig unterD
)H
ist die vom Gastgeber ausgewählte Tür (zufällig zwischenD
MinusC
undP
)F
ist die letzte vom Spieler gewählte Tür (deterministisch:D
MinusP
undH
)C==F
.Rückgabe: [1] 66.731
Bearbeiten
Ich kann ein paar Zeichen speichern, indem ich keine Variablen zuordne und ohne Verlust der Allgemeinheit davon ausgehe, dass
C==1
:quelle
Perl,
988983757271 ZeichenHier ist eine ernsthafte Antwort, die die Simulation tatsächlich ausführt:
In jeder Schleifeniteration ist die erste Wahl des Spielers immer Tür 2. Zuerst wird die Tür mit dem Auto aufbewahrt
$%
, dann wird eine andere Tür ausgewählt, die Monty Hall freilegen soll. Wenn die verbleibende Tür gleich ist,$%
ist die Runde gewonnen.(Perl-Interpunktionsvariablen
$%
und$=
werden verwendet, weil sie die Ganzzahlkürzung kostenlos durchführen.)quelle
Powershell -
168131125115Golfcode:
Einige Notizen:
Dieses Skript soll so präzise wie möglich sein und gleichzeitig das Monty Hall-Szenario so gründlich wie möglich simulieren. Es werden keine Annahmen darüber getroffen, wo sich das Auto befindet oder welche Tür der Spieler zuerst wählt. Es werden nicht einmal Annahmen getroffen, für welche bestimmte Tür der Host in einem bestimmten Szenario wählen wird. Die einzigen verbleibenden Annahmen sind diejenigen, die tatsächlich im Monty Hall-Problem angegeben sind:
Ungolfed, mit Kommentaren:
Ich habe dieses Skript mehrmals ausgeführt und es gibt konsistent Ergebnisse aus, die sehr nahe an der Wahrscheinlichkeit von zwei Dritteln liegen. Einige Beispiele:
(Wie oben)
(Verwenden
Get-Random
als Alias-Definition, anstatt nurRandom
)quelle
Ruby
484038Mein Code macht keine Annahmen darüber, hinter welcher Tür sich der Preis immer befindet oder welche Tür der Spieler immer öffnet. Stattdessen habe ich mich darauf konzentriert, was den Spieler zum Verlieren bringt. Gemäß dem Wikipedia-Artikel :
Um dies zu simulieren (anstatt feste Werte zu verwenden), habe ich es folgendermaßen modelliert:
Der Code v1:
Der Code v3 (danke an steenslag und Iszi!):
Einige Beispielrückgabewerte:
quelle
p (1..10000).count{rand(3)!=rand(3)}/1e2
spart einige Zeichen.1e4
für10000
?Mathematica 42
quelle
PowerShell, 90
Kommentiert:
quelle
1e4
anstelle von verwenden10000
.C
10195Das ist für die eigentliche Simulation. Für einige betrügerische Regeln zum Biegen von Regeln ist es nur
716559:Ich habe srand () nicht gemacht, weil die Regeln nicht sagten, dass ich musste. Außerdem druckt die betrügerische Version etwa 30.000 zusätzliche Zahlen aus, weil sie ein Zeichen speichert. Ich vermisse wahrscheinlich einige Tricks, aber ich habe mein Bestes gegeben.
quelle
main
und Sie können die=0
Initialisierungen löschen.Python 2:
72 6664Beispielausgabe: 66,49
quelle
exec"i-=randint(0,2)&1;"*i
anstelle derfor
Schleife verwenden.print.01*i
anstelle vonprint i/100.
.Fisch -
4643Dies basiert auf denselben Annahmen, die Tristin gemacht hat:
Die Abwärtsrichtung auf zeigt an
x
, dass Sie anfänglich die richtige Tür ausgewählt haben. Links und rechts sind die Fälle, in denen Sie eine andere Tür ausgewählt haben. Aufwärts ist nichts und rollt erneut.Ursprünglich initialisiert ich
10000
mit"dd"*
, aber"dd"
auf der gleichen Linie an alle sein musste, und ich einige Leerzeichen verschwendet. Durch Schlangen konnteaa*a*a*
ich eine Spalte und letztendlich 3 Zeichen entfernen. Es gibt noch ein bisschen Leerzeichen, das ich nicht mehr loswerden konnte. Ich finde das aber ziemlich gut!quelle
PHP 140
Aber ich denke, dass das nicht richtig funktioniert. Irgendein Tipp? Ich bekomme Werte von 49 bis 50.
quelle
Game Maker Language, 19 (51 mit Schleife)
Es gibt 66,67 aus! Dies ist die richtige Wahrscheinlichkeit;)
Der Serious-Mode-Code, 51 Zeichen:
Stellen Sie sicher, dass alle nicht initialisierten Variablen als 0 behandelt werden.
Der älteste Code, 59 Zeichen:
Stellen Sie erneut sicher, dass alle nicht initialisierten Variablen als 0 behandelt werden.
Die Ausgabe war
66.23
quelle