Elije la puerta correcta – Tcl y matemáticas

En un concurso de televisión se le ofrece al concursante la posibilidad de elegir una entre 3 puertas para quedarse lo que hay tras ella. El presentador le informa de que sólo una de ellas tiene un buen regalo (un apartamento en Torrevieja, un coche…), mientras que las otras dos están vacías. El concursante opta por una y el presentador (que conoce exactamente dónde está el regalo) abre lo que hay detrás de una de las otras dos puertas no elegidas por el concursante, donde no está el regalo. Luego le ofrece al concursante la opción de cambiar su decisión inicial eligiendo la otra puerta aún no abierta. ¿Qué debe hacer el concursante? Es decir, ¿debe cambiar de parecer sobre la puerta que eligió originalmente, o no?

El siguiente fragmento de código simula un concurso repetido 600 veces, donde se analiza qué pasaría sí el jugador cambiase o no de opinión.

# Ponemos unos contadores a cero
set sc 0
set nc 0
# Concursaremos i veces, en este ejemplo 600
for {set i 0} {$i < 600} {incr i} {
# Ponemos un premio detrás de una puerta, escogemos un numero entero aleatorio entre 0 y 2
set premio [expr [expr round([expr [expr rand()]*10])]%3]
# El jugador escoge su puerta, escogemos un numero entero aleatorio entre 0 y 2
set eleccion [expr [expr round([expr [expr rand()]*10])]%3]
# El presentador abre una de las otras dos puertas, donde no está el premio
# Si coincide la elección del jugador con el premio,
# aumentamos en 1 un contador inicial, y en ese caso no debería  cambiar de opinión.
# En caso contrario, aumentamos el 1 el otro contador.
if {$premio==$eleccion} {
set nc [expr $nc+1]
} else {
set sc [expr $sc+1]
}
set total [expr $sc+$nc]
}
# Porcentaje de aciertos cambiando y sin cambiar
set asc [expr [expr 100*$sc]/$total]
set anc [expr [expr $nc*100]/$total]
# Resultado
concat «La probabilidad de ganar cambiando de parecer es de aprox. un » $asc «%, y sin cambiar de parecer de un » $anc»%.»

El siguiente código genera un procedimiento con dos argumentos: el número de puertas y el número de veces que se concursa. Sólo hay que hacer algunos cambios en el código anterior.

proc concurso {numeropuertas veces} {
# Ponemos unos contadores a cero
set sc 0
set nc 0
# Concursaremos i veces, establecidas como argumento del procedimiento
for {set i 0} {$i < $veces} {incr i} {
# Ponemos un premio detrás de una puerta
set premio [expr [expr round([expr [expr rand()]*10])]%$numeropuertas]
# El jugador escoge su puerta
set eleccion [expr [expr round([expr [expr rand()]*10])]%$numeropuertas]
# El presentador abre una de las otras puertas, donde no está el premio
# Si coincide la elección del jugador con el premio,
# aumentamos en 1 un contador inicial, y en ese caso no debería cambiar de opinión.
# En caso contrario, aumentamos el 1 el otro contador.
if {$premio==$eleccion} {
set nc [expr $nc+1]
} else {
set sc [expr $sc+1]
}
set total [expr $sc+$nc]
}
# Porcentaje de aciertos cambiando y sin cambiar
set asc [expr [expr 100*$sc]/$total]
set anc [expr [expr $nc*100]/$total]
# Resultado
concat La probabilidad de ganar cambiando de parecer es de aprox. un $asc%, y sin cambiar de parecer de un $anc% (con $numeropuertas puertas, repetido $veces veces).
}

Lo único que se necesita para resolver el problema es escribir un código similar al siguiente, después de crear el procedimiento:

concurso 3 100

Podemos jugar más veces para garantizar un resultado más «fiable», o incluso con más de tres puertas:

Para probar los fragmentos decódigo de esta entrada, aocnsejamos escribiros directamente en la consola.

Write a Reply or Comment

Your email address will not be published.