elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Demostracion del problema de Monty Hall
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Demostracion del problema de Monty Hall  (Leído 1,837 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Demostracion del problema de Monty Hall
« 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...



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!


« Última modificación: 6 Noviembre 2016, 20:11 pm por AlbertoBSD » En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Demostracion del problema de Monty Hall
« Respuesta #1 en: 12 Agosto 2016, 17:15 pm »

Muy interesante  ;-)

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


En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Hall Life 2
Juegos y Consolas
Boricuozon 4 2,148 Último mensaje 14 Diciembre 2005, 00:49 am
por Boricuozon
robot monty
Electrónica
Zeroql 4 5,295 Último mensaje 20 Diciembre 2011, 14:15 pm
por Zeroql
Problema de Monthy Hall
Scripting
engel lex 4 2,729 Último mensaje 26 Diciembre 2014, 04:50 am
por FranciskoAsdf
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines