packages feed

stochastic-0.1.1.0: test/MontyHall.hs

import Control.Monad.State

import Data.Stochastic
import Data.Stochastic.Internal
import Data.Stochastic.Types

import qualified Data.Sequence as S

import System.Random

data Prize = Goat | Car
    deriving Eq

doorInit :: Int -> Sampler Prize
doorInit n = uniform $ Car : (take (n-1) $ repeat Goat)

removeDoor :: Prize -> Sampler Prize -> Sampler Prize
removeDoor b sa = let (da, g) = runState (runSample sa) (mkStdGen 0)
                      in case da of
                        Uniform l -> uniform $ removeFst b l
                        _ -> error "not monty hall"
                  where removeFst b [] = []
                        removeFst b (x:xs) = if x == b then xs
                                           else x : removeFst b xs

montyHall :: Sampler Prize
montyHall = do
    let doors = doorInit 3
    firstPick <- doors
    let remainingDoors = removeDoor firstPick doors
    removeDoor Goat remainingDoors

main = do
    gen <- newStdGen
    let a = sampleN 100000 montyHall gen
        a' = S.filter (== Car) a
        a'' = S.filter (== Goat) a
    print $ "Number of cars won: " ++ (show $ length a')
    print $ "Number of goats won: " ++ (show $ length a'')