誕生日問題の解のエレガントな求め方
nikoli.comで第1回24時間ジャンケン大会が開催されたけど,うかつにも参加しそびれた。
ところで,そこから派生した話題として次の問題がみんなのブログで論じられている。
> 1から86400の数字の中からランダムに数字を選ぶとします。
> 数字が重複する確率が50%を越えるのはいくつの数字を選んだときでしょう。
これ,複数の人が集まったときに誕生日が同じ組み合わせが存在する確率はいくらか,という問題設定が有名よね。
今回の場合の答えは347人とすでに求められているのだけれど,ためしにR言語で計算したらどうなるかやってみようとした。すると,Rには誕生日問題の近似解を求めるそのものずばりの関数があると分かった。いったい何に使うのかね。
例えば,各人か1から86400の中から1つの数字をランダム選ぶとき,2人以上が同じ数字を選ぶ確率が0.5となる人数の近似値は,以下で求められる。
> qbirthday(prob=0.5, classes=86400, coincident=2) [1] 346
答えは約346人。小数点以下丸められてるので,確率0.5以上となるのは何人か,という問いに対する答えとしては 346 か 347 か決まらないけど勘弁。
また,人数が463人のときに,2人以上が同じ数字を選ぶ確率の近似値は以下で求められる。
> pbirthday(n=463, classes=86400, coincident=2) [1] 0.7101461
答えは71%。
この人数と確率との関係のグラフを以下に示す。
f1<-function(n){pbirthday(n=n, classes=86400, coincident=2)} x<-1:1000 plot(x, sapply(x,f1), type="s", col="blue", ylim=c(0,1), xlab="n", ylab="probability")
近似値とはいえ,コマンド1つで解を求めることができるので,ある意味エレガントと思いますが,いかがでしょう。