Summary

쿠폰 수집가 문제를 simulation 해본다.

쿠폰 수집가 문제는, n 개의 서로 다른 쿠폰이 있을 때, n 개 모두 획득할 때까지 평균적으로 몇 번의 시도를 해야 할까? 라는 것이다.

예를 들어, 10개의 캐릭터가 있고, 과자 봉지 당 하나의 캐릭터가 있다. 나는 평균적으로 몇 개의 과자 봉지를 사야 10개 캐릭터 모두를 얻을 수 있을까?

참고로 보통 n 이 클 경우, n log n 에 근사한다고 알려져 있다.

n <- 10 # 쿠폰 총 종류 
coupon <- 1:n # 쿠폰 생성

num_trials <- 1000 # simulation 시도 횟수 

# 1번의 게임을 실행함
my_trial <- function()
{
  result <- c() # 획득한 쿠폰
  while (TRUE) {
    one_trial <- sample(coupon, 1) # 쿠폰 한장을 뽑고
    result <- c(result, one_trial) # 뽑은 쿠폰을 저장한다.
    
    # 모든 쿠폰을 모았는지 확인하고, 
    if(length(unique(result)) == n) {
      # 모든 쿠폰을 모았을 때까지의 총 시도 횟수를 반환한다.
      return (length(result))
    }
  }
}
my_trial() # 함수 기능 테스트
## [1] 25
trial_result <- sapply(1:num_trials, function(i) my_trial()) # simulation
trial_result_prop <- table(trial_result) / length(trial_result) # 상대도수를 구한다.
round(trial_result_prop, 2)
## trial_result
##   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26 
## 0.00 0.01 0.01 0.02 0.02 0.02 0.03 0.03 0.04 0.05 0.04 0.04 0.05 0.05 0.05 0.04 
##   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42 
## 0.04 0.03 0.04 0.03 0.04 0.04 0.03 0.03 0.02 0.03 0.02 0.02 0.02 0.01 0.01 0.01 
##   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58 
## 0.01 0.01 0.01 0.01 0.00 0.00 0.01 0.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
##   59   60   62   63   64   65   66   67   68   69   71   72   75   76   91   99 
## 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# 상대도수에 대한 histogram 을 그린다.
plot(trial_result_prop)

# 기대값을 구한다.
mean(trial_result)
## [1] 28.834
# 이론적인 기대값
theorical_result <- n * sum(1/coupon)
theorical_result
## [1] 29.28968