バースデーパラドックス

http://d.hatena.ne.jp/yone-chan/20080107#p1
バースデーパラドックスとは「23人集まれば50%の確率で同じ誕生日の人がいる」というものだそうです。
ホントかなぁと思って実際に計算してみました。Haskellは久し振りです。

module Main (main) where

import Text.Printf (printf)

f :: Int -> Double
f n = 100 * (1 - (product $ map (/ 365) $ [365 - n' + 1 .. 364]))
    where
      n' = fromInteger $ toInteger n

main :: IO ()
main = mapM_ (starling (printf "%2d -> %.02f%%\n") f) [2 .. 50]
    where
      starling f g x = f x $ g x

-- =>  2 -> 0.27%
--     3 -> 0.82%
--     4 -> 1.64%
--     5 -> 2.71%
--     6 -> 4.05%
--     7 -> 5.62%
--     8 -> 7.43%
--     9 -> 9.46%
--    10 -> 11.69%
--    11 -> 14.11%
--    12 -> 16.70%
--    13 -> 19.44%
--    14 -> 22.31%
--    15 -> 25.29%
--    16 -> 28.36%
--    17 -> 31.50%
--    18 -> 34.69%
--    19 -> 37.91%
--    20 -> 41.14%
--    21 -> 44.37%
--    22 -> 47.57%
--    23 -> 50.73% ← 23人で50%突破。
--    24 -> 53.83%
--    25 -> 56.87%
--    26 -> 59.82%
--    27 -> 62.69%
--    28 -> 65.45%
--    29 -> 68.10%
--    30 -> 70.63%
--    31 -> 73.05%
--    32 -> 75.33%
--    33 -> 77.50%
--    34 -> 79.53%
--    35 -> 81.44%
--    36 -> 83.22%
--    37 -> 84.87%
--    38 -> 86.41%
--    39 -> 87.82%
--    40 -> 89.12%
--    41 -> 90.32%
--    42 -> 91.40%
--    43 -> 92.39%
--    44 -> 93.29%
--    45 -> 94.10%
--    46 -> 94.83%
--    47 -> 95.48%
--    48 -> 96.06%
--    49 -> 96.58%
--    50 -> 97.04%

ふむ。確かに23人で50%を突破します。
参照: すべてはここから始まった〜SHA-1の脆弱化 (1/2):デファクトスタンダード暗号技術の大移行(1) - @IT