0votos

monty hall en Haskell

por josejuan hace 3 años

Se pueden calcular fácilmente que, vas a elegir coche el 1/3 de las veces, de esas, si no cambias obtienes un coche. Vas a elegir cabra el 2/3 de las veces, de esas, si no cambias obtienes cabra. Cómputo total si no cambias: 1/3 obtienes coche, 2/3 obtienes cabra. Por otro lado, vas a elegir coche el 1/3 de las veces, de esas, si cambias obtienes cabra. Vas a elegir cabra el 2/3 de las veces, de esas, si cambias obtienes coche. Cómputo total si cambias: 1/2 obtienes cabra, 2/3 obtienes coche.

realizar un programa en haskell para resolver el problema de probabilidades de monty hall

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{-# LANGUAGE TupleSections #-} 
import System.Random.Shuffle 
import Data.List 
import qualified Data.Map as M 
import Control.Arrow 
 
data Resultado = Resultado { sinCambiar :: Bool, cambiando :: Bool } deriving (Eq, Ord, Show) 
 
montyHall :: IO Resultado 
montyHall = do 
  puertas   <- shuffleM [True, False, False] 
  eleccion  <- head <$> shuffleM [0..2] 
  let (otra:_) = (reverse . sort) [puertas!!i | i <- [0..2], i /= eleccion] 
  return $ Resultado (puertas!!eleccion) otra 
 
experimentos :: Int -> IO [(Resultado, Double)] 
experimentos n = ( map (second (/ fromIntegral n)) 
                 . M.assocs 
                 . M.fromListWith (+) 
                 . map (,1.0) 
                 ) <$> mapM (const montyHall) [1..n] 
 
{- 
 
> experimentos 5000 >>= mapM_ print 
(Resultado {sinCambiar = False, cambiando = True},0.6706) 
(Resultado {sinCambiar = True, cambiando = False},0.3294) 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.