10曲のうち毎日ランダムに3曲聴くと,全部の曲を聴くのに何日かかるかをJulia で考えてみた!

2021/11/17に公開

問題

ある学校では昼休みにA,B,C,D,Eの5種類の曲の中から3種類ランダムに選んで放送をする。n日間で全ての曲を放送する確率を求めてみます。

実際に解くと,確率は

1-2\left(\frac25\right)^{n-1}+\left(\frac1{10}\right)^{n-1}

となります。

k日間で全ての曲がかかる場合をN回試行して,割合を調べて,実際の確率と比べてみます。

julia で計算してみます。

コード

prob1.jl
using Combinatorics

function prob1(k,N)
    a=collect(combinations(1:5, 3)) # 1,2,3,4,5から3数を選ぶ
    s=0
    for i = 1:N
        c = rand(a, k)# 1,2,3,4,5から3数を選ぶことをk回繰り返す。
        d = collect(Iterators.flatten(c)) #cを平坦化
        e = union(d) #dの共通部分をとる。
        f = length(e) #dの要素の個数
        if f == 5
            s += 1
        end
    end
    println(k,"日間で全ての曲がかかる確率の実験値は",s/N,"で,理論値は",1-2*(2/5)^(k-1)+(1/10)^(k-1))
end

3日間で全ての曲がかかるかどうかを100回調べて,その割合を求める。

prob1(3,100)

3日間で全ての曲がかかる確率の実験値は0.71で,理論値は0.69

1~10日間で全ての曲がかかるかどうかを100万回調べて,その割合を求める。

@time for i =1:10
    prob1(i,1000000)
end

1日間で全ての曲がかかる確率の実験値は0.0で,理論値は0.0
2日間で全ての曲がかかる確率の実験値は0.299848で,理論値は0.29999999999999993
3日間で全ての曲がかかる確率の実験値は0.689425で,理論値は0.69
4日間で全ての曲がかかる確率の実験値は0.872635で,理論値は0.873
5日間で全ての曲がかかる確率の実験値は0.948784で,理論値は0.9489
6日間で全ての曲がかかる確率の実験値は0.979672で,理論値は0.9795299999999999
7日間で全ての曲がかかる確率の実験値は0.991851で,理論値は0.991809
8日間で全ての曲がかかる確率の実験値は0.996678で,理論値は0.9967233
9日間で全ての曲がかかる確率の実験値は0.998683で,理論値は0.9986892900000001
10日間で全ての曲がかかる確率の実験値は0.999494で,理論値は0.9994757129999999
7.960092 seconds (119.78 M allocations: 11.636 GiB, 7.67% gc time)

8秒くらいですね。これでいいかな。

せっかくなので,10曲あって,毎日3曲ずつ聴くと,何日くらいで全部聞けるか考えてみます。

とりあえず,95%を超える日数を探ります。

prob2.jl
function prob2(k,N)
    a=collect(combinations(1:10, 3)) # 1~10から3数を選ぶ
    s=0
    for i = 1:N
        c = rand(a, k)# 1~10から3数を選ぶことをk回繰り返す。
        d = collect(Iterators.flatten(c)) #cを平坦化
        e = union(d) #dの共通部分をとる。
        f = length(e) #dの要素の個数
        if f == 10
            s += 1
        end
    end
    println(k,"日間で全ての曲がかかる確率の実験値は",s/N)
end
@time for i =1:10
    prob2(i,1000000)
end

1日間で全ての曲がかかる確率の実験値は0.0
2日間で全ての曲がかかる確率の実験値は0.0
3日間で全ての曲がかかる確率の実験値は0.0
4日間で全ての曲がかかる確率の実験値は0.014898
5日間で全ての曲がかかる確率の実験値は0.088279
6日間で全ての曲がかかる確率の実験値は0.218858
7日間で全ての曲がかかる確率の実験値は0.372286
8日間で全ての曲がかかる確率の実験値は0.51859
9日間で全ての曲がかかる確率の実験値は0.641596
10日間で全ての曲がかかる確率の実験値は0.739303
8.939245 seconds (125.76 M allocations: 12.377 GiB, 6.57% gc time)

おっと,10日ではまだ74%だ。もう少し調べてみる。

@time for i =11:20
  prob2(i,1000000)
end

11日間で全ての曲がかかる確率の実験値は0.812531
12日間で全ての曲がかかる確率の実験値は0.866424
13日間で全ての曲がかかる確率の実験値は0.905336
14日間で全ての曲がかかる確率の実験値は0.933101
15日間で全ての曲がかかる確率の実験値は0.952614
16日間で全ての曲がかかる確率の実験値は0.966809
17日間で全ての曲がかかる確率の実験値は0.97703
18日間で全ての曲がかかる確率の実験値は0.983837
19日間で全ての曲がかかる確率の実験値は0.988606
20日間で全ての曲がかかる確率の実験値は0.991889
15.302902 seconds (149.98 M allocations: 20.561 GiB, 6.28% gc time)

15日聞けば95%以上の確率で10曲全部聴けることになる! なるほど!

Discussion