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>でも、こういう確率の問題って、自分の直観があてにならなくて、好きです。