Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 11 Agosto 2016, 23:14 pm



Título: Demostracion del problema de Monty Hall
Publicado por: AlbertoBSD en 11 Agosto 2016, 23:14 pm
Quien no ha visto ese concurso donde hay un solo premio detras de 3 puertas las otras 2 con  Cabras u Ovejas...

(http://imgs.mx/i/OG)

La opción adecuada es siempre "cambiar" de puerta cuando te pregunten si te quieres cambiar de la misma..

El programa simula 10 Millones de Juegos 2 veces, en la primera ronda el jugador siempre cambia de puerta y en la segunda ronda el jugador nunca cambia de puerta.

Se demuestra que se tiene 66.6% de probabilidad de ganar si se cambia de puerta, contra 33.3% de probabilidad de ganar si no se cambia  de puerta.

Código
  1. #include<stdio.h>
  2. #include<stdint.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<time.h>
  6.  
  7. #define GOAT 0 //CABRA 0
  8. #define PRIZE 1 //PREMIO 1
  9.  
  10. #define MAX_SIMULATIONS 10000000
  11.  
  12. int main() {
  13. /*unsigned char */
  14. uint8_t position = 0; //Posicion del premio
  15. uint8_t selected = 0; //Posicion seleccionada por el jugado
  16. uint8_t doors[3]; //Puertas
  17. uint8_t can_switch = 0; //La puerta a la cual se puede cambiar
  18. register uint32_t count_win = 0;
  19. register uint32_t simulations = 0;
  20. srand(time(NULL)); //Semilla Random
  21. memset(doors,GOAT,sizeof(uint8_t)*3); //Todas las puertas son Cabras
  22. //< 10000000
  23. while(simulations < MAX_SIMULATIONS) {
  24. position = rand() % 3; //position del Premio Pseudo-Aleatoria
  25. doors[position] = PRIZE; //Guardamos el premio en la position antes seleccionada
  26. selected = rand() % 3; //position elejida por el Jugador
  27.  
  28. switch(selected) { //En base a lo elejido por el jugador
  29. //El encargado del juego valida que puerta tiene otra Cabra y la destapa
  30. //Dandole la oportunida al jugador de cambiar su puerta por la puerta restante
  31. case 0: //Puerta 0 elejida por el Jugador
  32. if(doors[1] == GOAT) { //Si otra puerta 1 Tiene cabra entonces
  33. can_switch = 2; //Le damos la oportunidad de elegir entre la puerta 0 y la puerta 2
  34. }
  35. else { //Caso contrario
  36. can_switch = 1; //Le damos la opotunidad de elegir entre la puerta 0 y la puerta 1
  37. }
  38. break;
  39. case 1: //Repetimos en caso de que seleccione la puerta 1
  40. if(doors[2] == GOAT) {
  41. can_switch = 0;
  42. }
  43. else {
  44. can_switch = 2;
  45. }
  46. break;
  47. case 2: //Repetimos en caso de que seleccione la puerta 2
  48. if(doors[0] == GOAT) {
  49. can_switch = 1;
  50. }
  51. else {
  52. can_switch = 0;
  53. }
  54. break;
  55. }
  56. if(doors[can_switch] == PRIZE) { //Evaluamos si la puerta elejida tiene el premio
  57. count_win++; //Si es asi incrementamos el contador de premios
  58. }
  59. doors[position] = GOAT; //0 //Restablecemos la puerta con premio nuevamente a Cabra
  60. simulations++; //Incrementamos el contador de Simulaciones
  61. }
  62.  
  63. //Imprimimos totales
  64. printf("Total simulations with change %u, win: %u rate: %f\n",simulations,count_win,(float)((float)count_win/(float)simulations));
  65.  
  66. count_win = 0; //Restablecemos contador de premios a 0
  67. simulations = 0; //Restablecemos contador de simulaciones a 0
  68.  
  69. //Como en la siguiente similacion el jugador no cambiara de puerta no es necesario evaluar las otras puertas
  70. while(simulations < MAX_SIMULATIONS) {
  71. position = rand() % 3;
  72. doors[position] = PRIZE;
  73. selected = rand() % 3;
  74. if(doors[selected] == PRIZE) {
  75. count_win++;
  76. }
  77. doors[position] = GOAT; //0
  78. simulations++;
  79. }
  80. printf("Total simulations without change %u, win: %u rate: %f\n",simulations,count_win,(float)((float)count_win/(float)simulations));
  81. return(0);
  82. }
  83.  

Descripción del problema:

https://en.m.wikipedia.org/wiki/Monty_Hall_problem


Salida del codigo arriba mostrado:

Código:
Total simulations with change 10000000, win: 6665613 rate: 0.666561
Total simulations without change 10000000, win: 3335076 rate: 0.333508
Saludos!


Título: Re: Demostracion del problema de Monty Hall
Publicado por: Yoel Alejandro en 12 Agosto 2016, 17:15 pm
Muy interesante  ;-)

Moraleja, siempre cambiar de opciones en la vida para así aumentar nuestras posibilidades de éxito