0
点赞
收藏
分享

微信扫一扫

礼券、卡片收集者问题

有一套卡片共有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


在这里插入图片描述

举报

相关推荐

0 条评论