Thursday, May 21, 2015

Prueba empírica del problema de Monty Hall

El problema de Monty Hall es un problema matemático bien conocido (es.wikipedia.org/wiki/Problema_de_Monty_Hall).

En este post voy a mostrar un simple programa para los incrédulos que aún piensen que la solución no es correcta.

Este tipo de problema consiste en los siguiente:

En un concurso, nos muestran tres cajas, donde en una hay escondido un premio y las dos restantes están vacías.

El presentador pide que seleccionemos una caja. A continuación, de las restantes cajas, el presentador abre una de ellas, la abre y muestra que está vacía.

En ese momento nos pregunta si queremos cambiar de caja.

¿Qué responderías?

En el momento de tomar esta decisión, hay dos cajas cerradas y sabemos que en una de ellas está el premio. La intuición nos dice que la probabilidad de que el premio esté en nuestra caja es del 50%.
Por lo tanto, cambiemos o no de caja, la probabilidad de llevarnos el premio será del 50%.

Pero esto no es correcto. Si cambiamos de caja, la probabilidad de acertar es aproximadamente del 67%

Aparentemente no tiene sentido, ¿no?.

Si en el momento en el que tenemos que tomar la decisión de cambiar o no de caja, viniera una persona que no ha visto lo que ha sucedido y se pusiera en nuestro lugar, la probabilidad de que se llevara el premio en ese caso sí sería del 50%. ¿Cómo puede ser que si cambiamos de caja aumente la probabilidad de ganar el premio?

La respuesta es muy sencilla. Cuando tenemos las tres cajas, la probabilidad de que el premio se encuentre en la caja que hemos seleccionado es del 33% (1/3). Sin embargo, la probabilidad de que el premio se encuentre en alguna de las cajas que no hemos seleccionados es del 67% (2/3).

Cuando el presentador muestra una caja vacía, la probabilidad de que el premio esté en la caja que hemos seleccionado sigue siendo del 33% y la probabilidad de que el premio se encuentre en alguna de las cajas que no hemos seleccionado también sigue siendo del 67%. Pero ahora el resto de cajas que no hemos seleccionado es una, ya que el presentador ha abierto la otra. Por lo tanto, cambiar de caja hace que la probabilidad de llevarnos el premio pase del 33% al 67%.

La persona que viene de fuera no tiene tanta información, no sabe que antes había tres cajas y que el presentador ha abierto una de las cajas que no tenía el premio. Es esta información lo que hace que nuestra probabilidad de llevarnos el tiempo sea del 67% frente al 50% que tiene la persona que viene de fuera.

Una forma sencilla de ver esto, es imaginar que en vez de tres cajas, hay 1000 cajas. En este caso, igual que antes, seleccionamos una caja y el presentador, a continuación, abre 998 cajas mostrando que están vacías. En este momento estamos en el mismo caso que antes, tenemos dos cajas y en una está el premio. ¿Cambiarías ahora de caja?. Seguro que sí, ¿no? La probabilidad de haber seleccionado la caja con el premio a la primera de entre 1000 cajas, es bastante baja.

Para los incrédulos, aquí he hecho un programa en Java que simula este concurso y lo prueba:

import java.util.Random;

public class ChangeVariable {
  private boolean boxes[];
  
  private int boxWithTheBall;
  private int shownEmptyBox;
  private int boxSelectedByPerson;
  
  private Random rnd;
  
  public ChangeVariable(boolean changeBox) {
    rnd = new Random();
    
    start(changeBox);
  }
  
  private void putBallInBox() {
    boxWithTheBall = rnd.nextInt(3);
    boxes=new boolean[3];
    boxes[boxWithTheBall]=true;
  }
  
  private void showEmptyBox() {
    do {
      shownEmptyBox = rnd.nextInt(3);
    } while (
        shownEmptyBox==boxWithTheBall ||
        shownEmptyBox==boxSelectedByPerson);
  }
  
  private void selectBox() {
    boxSelectedByPerson = rnd.nextInt(3);
  }
  
  private void changeBox() {
    for (int i=0;i<3;i++) {
      if (i!=shownEmptyBox && i!=boxSelectedByPerson) {
        boxSelectedByPerson = i;
        break;
      }
    }
  }
  
  private boolean isGuessed() {
    return boxSelectedByPerson==boxWithTheBall;
  }
  
  private void start(boolean changeBox) {
    int iterations = 100000;
    int hits=0; 
    
    for (int i=0;i<iterations;i++) {
      
      // Put a ball in a box
      putBallInBox();
      
      // The person selects a box
      selectBox();
      
      // Show an empty box which
      // is not the selected by the person
      showEmptyBox();
      
      if (changeBox) {
        // The person changes the box
        changeBox();
      } 
      
      if (isGuessed()) hits++;      
      
    }
    
    System.out.println("Hits: "+(hits/(float)iterations));
  }
  
  public static void main(String args[]) {
    boolean changeBox = false;
    
    new ChangeVariable(changeBox);
  }
}

Cuando lo ejecutamos con changeBox=false (no cambiamos de caja), la probabilidad que sale será algo parecido a 0.333 que corresponde al 33% (1/3) que matemáticamente corresponde.

Sin embargo, cuando lo ejecutamos con changeBox=true (siempre cambiamos de caja), la probabilidad que sale será algo parecido a 0.666 que corresponde al 67% (2/3) que acabamos de ver.

No comments:

Post a Comment