Nunca he podido entender el problema de Monty Hall . Aquí está la premisa:
Suponga que está en un programa de juegos y le dan la opción de elegir entre tres puertas: detrás de una puerta hay un automóvil; detrás de los demás, cabras. Usted elige una puerta, dice No. 1, y el anfitrión, que sabe lo que hay detrás de las puertas, abre otra puerta, dice No. 3, que tiene una cabra. Luego te dice: "¿Quieres elegir la puerta número 2?" ¿Le conviene cambiar su elección?
Ejecute 10,000 simulaciones. Salida del porcentaje de ganancia de cambio. Por ejemplo:
> 66.66733%
Respuestas:
JavaScript 52
Las puertas son 1: [0,1 / 3), 2: [1 / 3,2 / 3), 3: [2/3, 1)
Suponga que el premio siempre está en la puerta 3. Si el invitado elige las puertas 1 o 2, que es el rango [0,2 / 3), y cambia, ha ganado el premio.
fuente
i=s=0;s+=Math.random()<2/3while i++<1e4;alert s/100
J:
1715Elige una puerta aleatoria (etiquetemos estos 0, 1 o 2 donde 2 es la puerta con el automóvil) y calcula el beneficio de cambiar según esta lógica:
1
).1
).0
).Luego calcula el resultado como la suma de la matriz anterior, dividida por 100.
Soy bastante inestable con J, así que estoy seguro de que esto podría mejorarse aún más.
fuente
R
115100La respuesta de pseudo-simulación tiene 23 caracteres de longitud:
pero aquí hay una simulación real:
D
son las posibles puertasS
es una función para seleccionar aleatoriamente un elemento de un vectorC
es la puerta con el auto (al azar entreD
)P
es la puerta elegida por el jugador (al azar entreD
)H
es la puerta elegida por el anfitrión (al azar entreD
menosC
yP
)F
es la puerta final elegida por el jugador (determinista:D
menosP
yH
)C==F
.devuelve: [1] 66.731
Editar
Puedo guardar algunos caracteres al no asignar a variables y asumir sin pérdida de generalidad que
C==1
:fuente
Perl,
988983757271 caracteresAquí hay una respuesta seria que realmente ejecuta la simulación:
En cada iteración de bucle, la elección inicial del jugador es siempre la puerta # 2. Primero se almacena la puerta con el automóvil
$%
, luego se selecciona una puerta diferente para que Monty Hall la exponga. Si la puerta restante es igual a$%
, se gana la ronda.(Variables puncutation Perl
$%
y$=
se utilizan porque se hacen número entero de truncamiento de forma gratuita.)fuente
Powershell -
168131125115Código de golf:
Algunas notas:
Este guión pretende ser lo más conciso posible, a la vez que es una simulación tan completa del escenario de Monty Hall como sea posible. No hace suposiciones sobre dónde estará el auto o qué puerta elegirá el jugador primero. Ni siquiera se hacen suposiciones sobre qué puerta específica elegirá el host en un escenario dado. Las únicas suposiciones restantes son las que realmente se mencionan en el problema de Monty Hall:
Sin golf, con comentarios:
He ejecutado este script varias veces y produce resultados consistentemente muy cercanos a dos tercios de probabilidad. Algunas muestras:
(Como anteriormente)
(Utilizando
Get-Random
como la definición de alias, en lugar de soloRandom
)fuente
Rubí
484038Mi código no hace suposiciones sobre qué puerta siempre estará detrás del premio o qué puerta abrirá siempre el jugador. En cambio, me concentré en lo que hace que el jugador pierda. Según el artículo de Wikipedia :
Entonces, para simular esto (en lugar de usar valores fijos), lo modelé así:
El código v1:
El código v3 (¡gracias a steenslag e Iszi!):
Algunos valores de retorno de muestra:
fuente
p (1..10000).count{rand(3)!=rand(3)}/1e2
Guarda algunos caracteres.1e4
para10000
?Mathematica 42
fuente
PowerShell, 90
Comentado:
fuente
1e4
lugar de10000
.C,
10195Eso es para la simulación real. Para algunos códigos de flexión de reglas engañosos, es solo
716559:No hice srand () porque las reglas no decían que tenía que hacerlo. Además, la versión engañosa imprime alrededor de 30,000 números adicionales porque guarda un personaje. Probablemente me faltan algunos trucos, pero hice lo mejor que pude.
fuente
main
y podrá eliminar las=0
inicializaciones.Pitón 2:
72 6664Salida de ejemplo: 66.49
fuente
exec"i-=randint(0,2)&1;"*i
lugar delfor
bucle.print.01*i
lugar deprint i/100.
.Pescado -
4643Esto está utilizando los mismos supuestos que Tristin hizo:
La dirección hacia abajo en
x
representa que inicialmente seleccionó la puerta correcta, izquierda y derecha son los casos en que eligió una puerta diferente, y arriba no es nada, y rodará nuevamente.Originalmente, comencé
10000
con"dd"*
, pero"dd"
tenía que estar todos en la misma línea, y desperdicié algo de espacio en blanco. Al serpentearaa*a*a*
pude eliminar una columna y, en última instancia, 3 caracteres. Queda un poco de espacio en blanco que no he podido eliminar, ¡creo que esto es bastante bueno!fuente
PHP 140
Pero creo que esto no está funcionando bien. ¿Algún consejo? Estoy obteniendo valores de 49 a 50.
fuente
Game Maker Language, 19 (51 con bucle)
¡Produce 66.67! Esta es la probabilidad correcta;)
El código de modo serio, 51 caracteres:
Asegúrese de compilar con tratar todas las variables no inicializadas como 0.
El código más antiguo, 59 caracteres:
Nuevamente, asegúrese de compilar con tratar todas las variables no inicializadas como 0.
La salida fue
66.23
fuente