44種類のポスターを揃えるには何枚買う必要があるか(1)

http://blog.livedoor.jp/dqnplus/archives/1097052.html
経由
http://ameblo.jp/akihabara48/entry-10075346906.html


これは面白い。
いや、他人事だからだろうけど。
プログラミングのネタとして面白い。
ランダムでポスターを買って、何枚買うと44種類が全部揃うだろうか。
(実際には、44枚セットを買えばいいという話に変わったらしい)


組合せ論を使えば厳密にもできるだろうが、
とりあえず、擬似乱数で100万回やってみたら、
こんな確率分布が出た。
そんなに間違っていないと思う。

平均192枚買って全部揃う。
最小71枚、最大880枚。



use strict;

my $nMembers = 44; # must be even
my $half = $nMembers / 2;
my $full = (1 << $half) - 1;
my $nPlay = 1000000;
my @freq;

my $sum = 0;
for(my $i = 0; $i < $nPlay; $i++) {
my $n = play();
$freq[$n]++;
$sum += $n;
}

for(my $i = $nMembers; $i <= $#freq; $i++) {
printf "%4d %f\n", $i, $freq[$i] / $nPlay;
}

printf "mean : %.2f\n", $sum / $nPlay;

sub play {
my $n;
my ($lower, $upper) = (0, 0);
for($n = 0; ($lower & $upper) != $full; $n++) {
my $r = int(rand() * $nMembers);
if($r < $half) {
$lower |= 1 << $r;
}
else {
$upper |= 1 << ($r - $half);
}
}

return $n;
}