﻿# パッケージがインストール済なら次の行は不要
# import Pkg; Pkg.add("Statistics")
import Random  # 乱数を扱うためのモジュールをインポート
using Statistics
m = 100000  # 試行回数
n = 5  # 景品の種類
Yn = zeros(m)  # 景品を全種類集めるまでの購入回数を格納する配列
Random.seed!(1)  # 乱数のシード値を固定
for i in 1:m
    num_of_purchases = 0  # 購入回数
    coupon_vec = zeros(n)  # n次元配列(初期値は(0,0,...,0))
    while sum(coupon_vec) != n
        k = rand(1:n)  # 1からnまでの整数から無作為に1つの整数を取得
        # k番目の要素を1とし，k番目の景品を取得済みとみなす
        coupon_vec[k] = 1
        num_of_purchases += 1
    end
    Yn[i] = num_of_purchases
end
# 平均と分散の理論値を計算
t = sum(1 ./ collect(1:n))
mean_theoretical = n * t
u = sum(collect(1:(n-1)) ./ (n .- collect(1:(n-1))).^2)
var_theoretical = n * u
# 平均E(Yn)を表示
println(mean(Yn))  # モンテカルロ法
println(mean_theoretical)  # 参考：理論値
# 分散V(Yn)を表示
println(var(Yn))  # モンテカルロ法
println(var_theoretical)  # 参考：理論値