2010-05-17 [長年日記]
λ. A,O,B,ABの比率が4:3:2:1として、任意に4人集めたときにその全員の血液型が異なる確率
A,O,B,ABの比率が4:3:2:1として、任意に4人集めたときにその全員の血液型が異なる確率
finalfusionさんの問題が面白そうだったので、素朴な確率モナドを使って、Haskellで簡単に解いてみた。
import Data.List (nub) import qualified Data.Map as M import Control.Monad newtype Fractional w => P w a = P{ runP :: [(a, w)] } instance Fractional w => Monad (P w) where return a = P [(a, 1)] m >>= f = P $ do (a,p) <- runP m (b,q) <- runP (f a) return (b, p*q) random :: Fractional w => [(a,Integer)] -> P w a random xs = P [(a, fromInteger w / s) | (a,w) <- xs ] where s = fromInteger $ sum (map snd xs) data BloodType = A | O | B | AB deriving (Show, Eq) bloodtype :: Fractional w => P w BloodType bloodtype = random [(A,4),(O,3),(B,2),(AB,1)] problem :: Fractional w => P w Bool problem = do xs <- replicateM 4 bloodtype return $ length (nub xs) == 4 ans :: Double ans = M.fromListWith (+) (runP problem) M.! True
手計算ですぐ求まるような。
答えはいくつですか〜?
>たけをさん<br>手段の方が目的だったので、深く考えてなかったんですが、確かに。<br><br>>みはらさん<br>落ち着いて考えれば、すぐに分かると思いますよー<br># というか、答え合わせ?
いやー、もう仕事でいっぱいいっぱいでー><<br>答えが知りたかったんです。解いてないですが。<br>落ち着いたら考えますね〜
お仕事お疲れ様です。<br>楽しみを奪っちゃ悪いけど、一応答えだけ書いておくと 36 / 625 = 0.0576 のはず。<br># これで間違ってたら恥ずかしい…… (^^;
結構低いんですね!
さすがに全員違う確率ですからね。<br>でも、こういう確率の問題って、自分の直観があてにならなくて、好きです。