Powershell - 168 131 125 115
Golfcode:
nal g Random;1..1e4|%{$C=g 3;$P=g 3;$T+=$C-eq(0..2|?{$_-ne$P-and$_-ne(0..2|?{$_-ne$P-and$_-ne$C}|g)})};"$($T/100)%"
Änderungen gegenüber dem Original:
Mit einigen Änderungen wurden 53 Zeichen aus dem Originalskript entfernt.
- Leerzeichen und Klammern wurden entfernt, in denen PowerShell dies verzeiht.
- Verwendete eine
ForEach-ObjectSchleife über den %Alias anstelle von while.
- Verwendete Nummernkreise (zB
0..2:) anstelle explizit definierter Arrays.
- Aus
writedem letzten Befehl entfernt - es stellt sich heraus, dass ich ihn doch nicht brauche.
- Der Ausdruck für die Auswahl des Hosts wurde umgedreht, um die kürzere Pipelining-Syntax zu verwenden.
- 10000 durch 1e4 ersetzt.
- Nahm Joey Vorschlag und verzichtet
Get-aus Get-Random. (Hinweis: Diese Änderung erhöht die Laufzeit erheblich . Auf meinem System stieg sie von etwa 20 Sekunden auf fast eine halbe Stunde pro Lauf!)
- Gebrauchte Rynant Trick zu tun ,
$T+=...statt if(...){$T++}.
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:
- Der Gastgeber wählt eine Tür aus, die der Spieler nicht zuerst ausgewählt hat und die das Auto nicht enthält.
- Wenn der Spieler zuerst mit dem Auto die Tür geöffnet hat, bedeutet dies, dass der Gastgeber zwei Möglichkeiten hat.
- Die endgültige Wahl des Spielers ist weder seine ursprüngliche Wahl noch die Wahl des Gastgebers.
Ungolfed, mit Kommentaren:
# Setup a single-character alias for Random, to save characters later.
# Note: Script will run a lot (about 500 times) faster if you use Get-Random here.
# Seriously, as it currently is, this script will take about a half-hour or more to run.
# With Get-Random, it'll take less than a minute.
nal g Random;
# Run a Monty Hall simulation for each number from 1 to 10,000 (1e4).
1..1e4|%{
# Set car location ($C) and player's first pick ($P) to random picks from a pool of 3.
# Used in this way, Random chooses from 0..2.
$C=g 3;$P=g 3;
# Increment win total ($T) if the car is behind the door the player finally chooses.
# (Player's final choice represented by nested script.)
$T+=$C-eq(
# Filter the doors (0..2) to determine player's final choice.
0..2|?{
# Player's final choice will be neither their original choice, nor the host's pick.
# (Host's pick represented by nested script.)
$_-ne$P-and$_-ne(
# Filter the doors to determine host's pick.
0..2|?{
# Host picks from door(s) which do not contain the car and were not originally picked by the player.
$_-ne$P-and$_-ne$C
# Send filtered doors to Random for host's pick.
}|g
)
}
)
};
# After all simulations are complete, output overall win percentage.
"$($T/100)%"
# Variable & alias cleanup. Not included in golfed script.
rv C,P,T;ri alias:g
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-Randomals Alias-Definition, anstatt nur Random)
- 66,92%
- 67,71%
- 66,6%
- 66,88%
- 66,68%
- 66,16%
- 66,96%
- 66,7%
- 65,96%
- 66,87%