トップ «前の日記(2010-05-15) 最新 次の日記(2010-05-22)» 月表示 編集

日々の流転


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
Tags: quiz haskell
本日のツッコミ(全7件) [ツッコミを入れる]
ψ たけを (2010-05-18 16:23)

手計算ですぐ求まるような。

ψ みはら (2010-05-18 19:40)

答えはいくつですか〜?

ψ さかい (2010-05-18 21:02)

>たけをさん<br>手段の方が目的だったので、深く考えてなかったんですが、確かに。<br><br>>みはらさん<br>落ち着いて考えれば、すぐに分かると思いますよー<br># というか、答え合わせ?

ψ みはら (2010-05-20 22:46)

いやー、もう仕事でいっぱいいっぱいでー><<br>答えが知りたかったんです。解いてないですが。<br>落ち着いたら考えますね〜

ψ さかい (2010-05-20 23:37)

お仕事お疲れ様です。<br>楽しみを奪っちゃ悪いけど、一応答えだけ書いておくと 36 / 625 = 0.0576 のはず。<br># これで間違ってたら恥ずかしい…… (^^;

ψ みはら (2010-05-21 04:22)

結構低いんですね!

ψ さかい (2010-05-21 12:17)

さすがに全員違う確率ですからね。<br>でも、こういう確率の問題って、自分の直観があてにならなくて、好きです。