有一套卡片共有n种卡,集齐n种卡就能中奖,每次抽卡会随机获得一张,已知n,求恰好收集一套的时候期望抽卡多少次?
类似于方便面有12星座卡片,期望买多少包才能集齐一套?
# 假设有一套卡片,每次收集会随机获得一张,那么期望什么时候能正好集齐一套呢,均等概率没有稀有卡片不能与别人换牌
import random
def fn(size):
'''
:param size: 这套卡片的规模
:return: 期望
'''
tries = 1000
total = 0 # 所有实验所需要的总抽卡次数
for j in range(tries):
li = [0 for i in range(size)]
sum = 0 # 每次实验需要的抽卡次数
while 0 in li:
li[random.randint(0, size - 1)] += 1
sum += 1
total += sum
ex = total / tries # 期望
return ex
def math_fn(size):
'''
:param size:卡片规模
:return: 数学解
'''
res=0
n=size
# 当n足够大时,可以调和级数约等于ln(n),返回n*ln(n)
for i in range(1,n+1):
res+=1/i
return res*n
def show(size):
ex1=fn(size)
ex2=math_fn(size)
print(f"{size}\t张,仿真{ex1:.3f}\t,数学{ex2:.3f}\t")
for size in range(1,13):
show(size)
show(100)
show(108)
show(1000)
# 1 张,仿真1.000 ,数学1.000
# 2 张,仿真2.991 ,数学3.000
# 3 张,仿真5.624 ,数学5.500
# 4 张,仿真8.220 ,数学8.333
# 5 张,仿真11.373 ,数学11.417
# 6 张,仿真14.662 ,数学14.700
# 7 张,仿真18.057 ,数学18.150
# 8 张,仿真21.223 ,数学21.743
# 9 张,仿真25.708 ,数学25.461
# 10 张,仿真28.736 ,数学29.290
# 11 张,仿真32.938 ,数学33.219
# 12 张,仿真37.347 ,数学37.239
# 100 张,仿真519.676 ,数学518.738
# 108 张,仿真569.053 ,数学568.509
# 1000 张,仿真7473.486 ,数学7485.471