ポスター44種類コンプリート問題

CD1枚購入のたびに、ポスターが44種類のうち1種類ランダムに得られるとする。

Q1. 44種類コンプリートするには、平均何枚のCDを購入する必要があるか。

Q2. 44種類コンプリートした人はその時点で何種類のポスターを持っているか。

数学的なことは分からないのでRuby先生に聞いてみた。

KIND_NUM = 44
N = 100000
flags = Array.new( KIND_NUM )
sum = 0
N.times do
	flags.fill( false )
	n = 0
	until flags.all?
		flags[rand(KIND_NUM)] = true
		n += 1
	end
	sum += n
end
puts "平均: #{sum.to_f/N}"

だいたい192枚ぐらいらしい。

      • -

Cでも書いた。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define KIND_NUM 44
#define NTRY 100000

int main() {
	char flags[KIND_NUM];
	int i, sum = 0;
	for( i = 0; i < NTRY; i++ ) {
		memset( flags, 0, sizeof flags );
		while( memchr( flags, 0, sizeof flags ) != NULL ) {
			flags[rand()%KIND_NUM] = 1;
			sum ++;
		}
	}
	printf( "%f\n", ((double)sum)/NTRY );
}

やっぱりCは速いなー。