数学吧 关注:844,372贴子:8,584,673
  • 2回复贴,共1

求助一个概率计算式

只看楼主收藏回复

下面简称双方都可见的牌即“可见”,psuits存放player手牌包含的花色,pseen存放player可见牌包含的花色,nohave存放target已知player没有的花色;ts存放target的所有手牌(花色),tseen存放target可见牌(花色)。
现要求target展示一张牌,若player有此花色的牌视为player成功。分别求用上述变量或它们的交并补集等描述的下述情况下player成功概率的表达式:(1)target尽可能选择player有的花色;(2)target尽可能选择player没有的花色
或者其他能降低计算时间复杂度的方法
穷举代码在下面


IP属地:天津来自Android客户端1楼2023-12-25 09:53回复
    import itertools
    #初始化
    allsuits = ['1', '2', '3', '4']
    ts = list(input("请输入target拥有的手牌, 0表示不可见:")) #target手牌
    psuits = list(input("请输入player拥有的花色:")) #player总花色
    pseen = [] #player可见花色
    tseen = [] #target可见牌
    allseen = int(input("player的牌是否全部可见?(1/0):")) #player牌是否全部可见
    unseen = 0 #target不可见牌数量
    nohave = [] #player没有的花色
    for i in ts:
    if i != '0': tseen.append(i)
    else: unseen += 1
    for i in psuits:
    if allseen or int(input(f"player拥有的'{i}'花色是否可见(1/0):")) != 0: pseen.append(i)
    if allseen: nohave = [x for x in allsuits if x not in psuits]
    elif len(psuits) != 4:
    nohave = list(input("请输入target已知player没有的花色(0则没有):"))
    if nohave[0] == '0': nohave = []
    #穷举计算成功率
    allcases = list(itertools.product(allsuits, repeat=unseen)) #为target未知手牌生成所有可能的情况
    #计算target尽可能选择player有的花色的成功率
    odds1 = 0
    for tcards in allcases: #穷举所有情况,下同
    fz = 0 #此条件下成功情况数
    fm = 0 #此条件下总情况数
    temp = None
    tcards = list(tcards) + tseen #加上可见手牌
    for i in tcards:
    if i in pseen: #player肯定有此花色
    temp = 1
    break
    if i not in nohave: #player可能有此花色
    fm += 1
    if i in psuits: fz += 1
    if temp == 1: odds1 += 1/len(allcases) #这种情况必然成功
    elif fm != 0: odds1 += fz/fm/len(allcases) #此条件下成功率/总条件数
    #计算target尽可能选择player没有的花色的成功率
    odds2 = 0
    for tcards in allcases:
    fz = 0
    fm = 0
    temp = None
    tcards = list(tcards) + tseen
    for i in tcards:
    if i in nohave: #player肯定无此花色
    temp = 0
    break
    if i not in pseen: #player可能无此花色
    fm += 1
    if i in psuits: fz += 1
    if temp == 0: continue
    elif fm == 0: odds2 += 1/len(allcases)
    else: odds2 += fz/fm/len(allcases)
    print(f"target尽可能选择player有的花色的情况下player的成功率为{odds1},尽可能选择player没有的花色的情况下为{odds2}")


    IP属地:天津来自Android客户端2楼2023-12-25 09:55
    回复
      代码方便起见直接用'1', '2', '3', '4'代表四种花色,前面是初始化数据,player用手牌是否全部可见来让target推测player有无没有的花色。此外我发现似乎除了(1)情况双方有同花色明牌和(2)情况target明牌里有player明确没有的花色的牌外,同一事件下两个情况概率之和好像都是1


      IP属地:天津来自Android客户端3楼2023-12-25 10:04
      回复