Problema de Monty Hall. Solución demostrada con PHP

El enunciado del problema, extraído de la wikipedia que a su vez ha sido extraído de «una carta de Craig F. Whitaker a la columna de Marilyn vos Savant en Parade Magazine en 1990» reza así:

Supón que estás en un concurso, y se te ofrece escoger entre tres puertas: detrás de una de ellas hay un coche, y detrás de las otras, cabras. Escoges una puerta, digamos la nº1, y el presentador, que sabe lo que hay detrás de las puertas, abre otra, digamos la nº3, que contiene una cabra. Entonces te pregunta: «¿No prefieres escoger la nº2?». ¿Es mejor para ti cambiar tu elección?

La solución: Dado que en un principio nuestras posibilidades de fallar eran mayores, probablemente fallasemos. Al reducir el problema descartando una de las puertas erróneas, obtenemos la puerta elegida inicialmente (la que probablemente sea la errónea) y la contraria (la que probablemente sea la correcta). Es decir, si tenemos una alta probabilidad de fallar, fallaremos. Por lo tanto, la solución a este problema es que es prudente cambiar de puerta ya que tendremos más probabilidades de acertar.

En esta escena de no se que película se explica el problema: http://www.youtube.com/watch?v=_mbO-ndr740

Aqui la entrada en la wikipedia del problema de Monty Hall: http://es.wikipedia.org/wiki/Problema_de_Monty_Hall

Y para los que se aburran: http://es.wikipedia.org/wiki/Teorema_de_Bayes

Y ahora, el código PHP que lo demuestra:

<?php

/*****Sin cambiar de puerta******/
$puertas=array(1=>'cabra', 2=>'coche', 3=>'cabra');
$aciertos=0;

for($i=0;$i!=10;$i++){
     $puerta_elegida=rand(1,3);
     // ya que en ningun momento vamos a cambiar de puerta, si acertamos a la primera,
     // apuntamos acierto. Si no acertamos, no se hace nada.
    if($puertas[$puerta_elegida] == "coche"){ $aciertos++; }
}
echo "Aciertos sin cambiar de puerta: $aciertos/10 <br />\n";

/******Cambiando de puerta*****/
$aciertos=0;

for($i=0;$i!=10;$i++){
     $puerta_elegida=rand(1,3);

     foreach($puertas as $key => $valor){ //recorremos el array
         //determinamos la puerta a eliminar
         if($key != $puerta_elegida && $valor == "cabra"){ $puerta_eliminada=$key; }
     }

     //detectamos la puerta contraria a la elegida de las dos que nos quedan
     foreach($puertas as $key => $valor){
         if($key != $puerta_elegida && $key != $puerta_eliminada){
        //si la puerta a la que cambiamos es un coche, apuntamos acierto
             if($puertas[$key] == "coche"){ $aciertos++; }
         }
     }
}
echo "Aciertos cambiando de puerta: $aciertos/10 <br />\n";

?>

Este script realiza 10 veces el problema en cada caso, tanto sin cambiar de puerta (la primera porción) como cambiando de puerta (la segunda porción). Ejecutando el script diez veces, obtengo estos resultados:

Aciertos sin cambiar de puerta: 2/10
Aciertos cambiando de puerta: 6/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 10/10

Aciertos sin cambiar de puerta: 7/10
Aciertos cambiando de puerta: 7/10

Aciertos sin cambiar de puerta: 5/10
Aciertos cambiando de puerta: 6/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 9/10

Aciertos sin cambiar de puerta: 2/10
Aciertos cambiando de puerta: 7/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 7/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 9/10

Aciertos sin cambiar de puerta: 2/10
Aciertos cambiando de puerta: 10/10

Aciertos sin cambiar de puerta: 3/10
Aciertos cambiando de puerta: 5/10

Queda demostrado pues, que cambiar de puerta es la elección correcta.

Actualización [20/05/2010]:  Me comenta Jony que la escena de la película (el enlace a youtube) es en realidad una escena de la serie Numb3rs (http://www.imdb.com/title/tt0433309/). Gracias por la corrección x).

2 respuestas a “Problema de Monty Hall. Solución demostrada con PHP”

  1. simon dice:

    Amigo no tienes esta demostración en lenguaje C?

  2. NachE dice:

    Lo siento, no la hice en C. En ese momento estaba más metido en PHP que en otro lenguaje, así que lo hice en PHP. Si lo hiciera hoy día, seguramente usaría Python…