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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Problema de Monthy Hall
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema de Monthy Hall  (Leído 2,984 veces)
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Problema de Monthy Hall
« en: 25 Diciembre 2014, 08:35 am »

Este es un famoso problema estadístico que la gente ha discutido mucho debido a lo pico lógico que parece, así que echaré mano al asunto para demostrar su punto y veracidad haciendo uso de python

El problema va así



En un programa de televisión te hacen escoger entre 3 puertas, en una hay un carro deportivo y en 2 hay cabras, escoges una puerta, el presentador abre otra puerta mostrandote una de las cabras, el te pregunta "deseas cambiar tu puerta?".... aquí viene el problema...

Mucha gente dice "nah da igual cambiar puerta, el chance en este punto es 50/50", sin embargo la estadística dice algo diferente... dice que "originalmente tenias 1/3 de probabilidad de ganar, y ahora sigues solo  con 1/3 , si cambias la puerta tienes 2/3 debido que la probabilidad de victoria colapsó en la otra puerta"...

aquí entra la lógica y dice "eso no tiene sentido... son 2 puertas así que debe ser 50/50...

Ahora quien está en lo correcto? Por su puesto que la estadística., si cambias tienes el doble de chance de ganar

Por qué? Imaginemos 3 universos donde escoges cada puerta diferente... en todos seguimos el mismo procedimiento, te muestran la cabra, decides no cambiar.... entonces en dos pierdes (los que no escogiste el carro) y uno ganas.... pero si decidimos cambiar, en dos ganas(los que no escogiste el carro) y uno pierdes...

Si schrodinger hubiera conocido esto seguro lo hubiera  escogido, en lugar de un gato hipotético... cuando la realidad colapsa, al igual que la física cuántica, quedas en uno de 3 universos probables...

Muchos aún dirán...  "si ya pasamos el hecho de la puerta abierta y nos fijamos en el ahora, sigue siendo 50/50", pero el problema es que era una ecuación donde se agregó informacion, así que el pasado es importante...

Si aun no me creen y consideran que es ilógico y sin sentido, me remito al ejemplo.... hice un programa de python que 'juega' a esto sin hacer trampa y muestra como la realidad se define más allá de lo simplemente lógico  :)

Código
  1. from random import randint #yeap vamos a generar int random
  2.  
  3. def colocarPremio():
  4.  puertas = [0,0,0] #establecemos 3 puertas
  5.  puertas[randint(0,2)] = 1 #colocamos premio en una
  6.  return puertas
  7.  
  8. def seleccionJugador():
  9.  return randint(0,2) #el jugador escoge una puerta
  10.  
  11. def mostrarPuerta(jugador, puertas):
  12.  presentador = 0 #el presentador entra y saluda a todos
  13.  for i in range(3):
  14.    if puertas[i] == 0 and not i == jugador: #el presentador escoge una puerta que no sea la del jugador y no tenga premio
  15.      presentador = i #y se queda con esa puerta
  16.      break #porque no tiene que seguir buscando
  17.  return presentador
  18.  
  19. def cambiarPuerta(presentador, jugador):
  20.  for i in range(3):
  21.    if not i == presentador and not i == jugador: #el jugador escoge la otra puerta cerrada
  22.      jugador = i #y se queda con esa
  23.      break #porque no tiene que seguir buscando
  24.  return jugador
  25.  
  26. def juego(cambiar):
  27.  puertas = colocarPremio() #ponemos las puertas y el premio
  28.  jugador = seleccionJugador() #el jugador escoge
  29.  presentador = mostrarPuerta(jugador, puertas) #el presentador muestra
  30.  if cambiar: jugador = cambiarPuerta(presentador, jugador) #debo cambiar?
  31.  return puertas[jugador] #tendra premio?
  32.  
  33.  
  34. jugadas = 100 #cuantas veces te lo tengo que repetir para convencerte?
  35. cambio = True #cambiar o no cambiar, he alli el dilema
  36.  
  37. contador = 0 #contador victorias
  38. for i in range(jugadas): contador += juego(cambio) #el momento de la verdad... juguemos
  39.  
  40. if not cambio: cambio = 'no ' #formateo cadena bonita
  41. else:  cambio = '' #y por si...
  42.  
  43. print 'en {} jugadas hubo {} victorias si el jugador {}cambiaba de puerta'.format(jugadas,contador,cambio) #resultado

Para aquellos curiosos sin python instalado, pueden ejecutar online en paginas como esta


« Última modificación: 25 Diciembre 2014, 08:44 am por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Problema de Monthy Hall
« Respuesta #1 en: 25 Diciembre 2014, 11:21 am »


son 2 puertas así que debe ser 50/50...

Ahora quien está en lo correcto? Por su puesto que la estadística., si cambias tienes el doble de chance de ganar



Gracias por compartir !!


« Última modificación: 25 Diciembre 2014, 11:23 am por Eleкtro » En línea



engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema de Monthy Hall
« Respuesta #2 en: 25 Diciembre 2014, 21:51 pm »

Si, cuando yo vi el problema por primera vez hace muchos años fue asi como que "nah, gente loca sin sentido", vi una comprobacion en mythbusters y fue asi como que

"Será cierto?"

Yo mismo me puse a testearlo con un amigo y tarjetas y fue asi como que mind fu..

La teoría tras eso siempre se me hizo abstracta y difícil de digerir...

La forma mas simple que lo puedo ver es en la forma de definirlo en multiples posibles universos tipo schrodinger, donde vives en un universo aun no definido hasta que pasas a la observación y las probabilidades colapsan como una  realidad

En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
explorer

Desconectado Desconectado

Mensajes: 102


Analista/Programador Perl


Ver Perfil
Re: Problema de Monthy Hall
« Respuesta #3 en: 26 Diciembre 2014, 03:36 am »

Como también se comenta en la página de Wikipedia referido al problema de Monty Hall, una forma de verlo mejor es pensado que hay cien puertas.

Entonces, tienes 1/100 de probabilidad de conseguir el carro. Entonces, en el resto de puertas, hay un 99/100 de probabilidad de que esté el carro.

Va el presentador y abre 98 puertas. En todas ellas hay una cabra. Quedan la puerta escogida por el jugador y una puerta más. Y viene la famosa pregunta de que si quiere cambiar.

Se puede pensar que el 98/100 de probabilidades que había entre las puertas abiertas se ha repartida entre las dos puertas que quedan cerradas, así que estamos hablando de un 50 % de probabilidad, pero no es así.

La puerta del jugador sigue teniendo 1/100 de probabilidad (la original), y la puerta que ha dejado cerrada el presentador, "ha recibido" todas las probabilidades de las 98 puertas abiertas. Mejor dicho: las 99 puertas restantes tenían el 99/100 de probabilidad de tener el carro. Al abrir 98 puertas, y ver que no hay carro, cada puerta abierta confirma tener un 0/100 de probabilidad de tener un carro, y van "trasladando" la probabilidad de tener un carro hacia la puerta que queda cerrada.

En ese momento, la puerta escogida tiene un 1/100 y la puerta restante, un 99/100, así que es lógico hacer el cambio, ya que ganaremos 99 de cada 100 veces que lo intentemos.

La siguiente versión del programa permite ejecutar con un número arbitrario de puertas (tres o más). Jugando con 100 puertas, ganaremos casi siempre.
Código
  1. #!/usr/bin/python
  2. from random import randint
  3.  
  4. VACIA  = 0
  5. CABRA  = 2
  6. PREMIO = 1
  7.  
  8. def colocarPremio():
  9.  puertas = [] # establecemos las puertas
  10.  for i in range(numero):
  11.     puertas.append(VACIA)
  12.  
  13.  puertas[ randint(0,numero-1) ] = PREMIO # colocamos premio en una
  14.  return puertas
  15.  
  16. def seleccionJugador():
  17.  return randint(0,numero-1) # el jugador escoge una puerta
  18.  
  19. def mostrarPuerta(jugador, puertas):
  20.  presentador = 0 # el presentador entra y saluda a todos
  21.  puertas_abiertas = 0
  22.  for i in range(numero):
  23.    if i != jugador and puertas[i] != PREMIO: # el presentador escoge una puerta que no sea la del jugador y no tenga premio
  24.      puertas[i] = CABRA # y muestra la cabra
  25.      puertas_abiertas += 1
  26.  
  27.      if puertas_abiertas == numero-2: # dejamos cerradas solo dos puertas
  28.        break
  29.  return presentador
  30.  
  31. def cambiarPuerta(puertas,presentador, jugador):
  32.  for i in range(numero):
  33.    if i != jugador and puertas[i] != CABRA: # el jugador escoge la otra puerta cerrada
  34.      jugador = i # y se queda con esa
  35.      break # porque no tiene que seguir buscando
  36.  return jugador
  37.  
  38. def juego(cambiar):
  39.  puertas = colocarPremio() # ponemos las puertas y el premio
  40.  jugador = seleccionJugador() # el jugador escoge
  41.  presentador = mostrarPuerta(jugador, puertas) # el presentador muestra
  42.  if cambiar: jugador = cambiarPuerta(puertas, presentador, jugador) # debo cambiar o no
  43.  return puertas[jugador] # tendra premio o no
  44.  
  45. numero  = 100 # numero de puertas
  46. jugadas = 100 # cuantas veces te lo tengo que repetir para convencerte?
  47. cambio  = True # cambiar o no cambiar, he alli el dilema
  48.  
  49. contador = 0 # contador victorias
  50. for i in range(jugadas): contador += (juego(cambio) == PREMIO) # el momento de la verdad... juguemos
  51.  
  52. if not cambio: cambio = 'no ' # formateo cadena bonita
  53. else:  cambio = '' # y por si...
  54.  
  55. print 'en {} jugadas hubo {} victorias si el jugador {}cambiaba de puerta'.format(jugadas,contador,cambio) #resultado
  56.  
Para completar, aquí está la misma versión del programa, en Perl:
Código
  1. #!/usr/bin/perl
  2. #
  3. # Monty Hall
  4. #
  5. # https://es.wikipedia.org/wiki/Problema_de_Monty_Hall
  6. #
  7. use Modern::Perl 2014;
  8. use utf8::all;
  9.  
  10. ## Constantes
  11. use constant {
  12.    CERRADA => 0,
  13.    CABRA   => 1,
  14.    COCHE   => 2,
  15.    False => 0,
  16.    True  => 1,
  17. };
  18. my $número_de_puertas = 3;
  19. my $número_de_jugadas = 100;
  20. my $hace_el_cambio    = True;
  21.  
  22. ## Variables
  23. my @puertas;
  24. my $puerta_elegida;
  25. my $victorias = 0;
  26.  
  27. ## Proceso
  28. for (1 .. $número_de_jugadas) {
  29.    $victorias++ if juego() == COCHE;
  30. }
  31.  
  32. say "En $número_de_jugadas jugadas con $número_de_puertas puertas "
  33.  . "hubo $victorias victorias si el jugador "
  34.  . ($hace_el_cambio ? 'sí':'no')
  35.  . " cambiaba de puerta"
  36.  ;
  37.  
  38. ## subrutinas
  39. sub juego {
  40.  
  41.    inicializar_puertas();
  42.    colocar_premio();
  43.    jugador_selecciona_puerta();
  44.    mostrar_puertas_con_cabras();
  45.  
  46.    if ($hace_el_cambio) {
  47.        jugador_cambia_de_puerta();
  48.    }
  49.  
  50.    return $puertas[$puerta_elegida];
  51. }
  52.  
  53. sub inicializar_puertas {
  54.    @puertas = (CERRADA) x $número_de_puertas;
  55. }
  56.  
  57. sub colocar_premio {
  58.    $puertas[ rand @puertas ] = COCHE;
  59. }
  60.  
  61. sub jugador_selecciona_puerta {
  62.    $puerta_elegida = int rand @puertas;
  63. }
  64.  
  65. sub mostrar_puertas_con_cabras {
  66.  
  67.    for my $i (1 .. $número_de_puertas - 2) { # abrir todas menos la del coche y la elegida
  68.  
  69.        my $j = $i-1; # los índices en los array empiezan en 0
  70.  
  71.        $j++ until $puertas[$j] == CERRADA  and  $j != $puerta_elegida;
  72.  
  73.        $puertas[$j] = CABRA; # ¡Bééééé-ééé!
  74.    }
  75. }
  76.  
  77. sub jugador_cambia_de_puerta {
  78.  
  79.    # Buscar la siguiente puerta que esté cerrada
  80.    for my $i (0 .. $#puertas) {
  81.  
  82.        if ($puerta_elegida != $i  and  $puertas[$i] != CABRA) {
  83.            $puerta_elegida  = $i; # será la nueva elegida
  84.            last;
  85.        }
  86.    }
  87. }
  88.  
« Última modificación: 26 Diciembre 2014, 03:38 am por explorer » En línea

FranciskoAsdf

Desconectado Desconectado

Mensajes: 231


Ni bueno, ni malo. Solo nada.


Ver Perfil WWW
Re: Problema de Monthy Hall
« Respuesta #4 en: 26 Diciembre 2014, 04:50 am »

Excelente, me ha quedado dando la vuelta como seria en otros leguajes, pero esta muy bien explicado, gracias !:P
« Última modificación: 26 Diciembre 2014, 04:53 am por FranciskoAsdf » En línea

Asdf debería ser algún tipo de función.
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,375 Último mensaje 14 Diciembre 2005, 00:49 am
por Boricuozon
Demostracion del problema de Monty Hall
Programación C/C++
AlbertoBSD 1 2,042 Último mensaje 12 Agosto 2016, 17:15 pm
por Yoel Alejandro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines