Python扑克手单对计数器

时间:2015-07-13 11:15:59

标签: python combinations probability itertools poker

我编写了下面的程序来迭代每一个可能的扑克手并计算这些牌中有多少只是一对

手牌是5张牌 一对是当两张相同级别(数字)的牌和另外三张所有不同级别的牌时,例如(1,2,1,3,4)

我代表卡片组作为数字列表,例如
- 1 = ACE
- 2 =两个
- 3 =三  ...
- 11 =杰克
- 12 =女王......

该程序似乎找不到, 它找到的单对手的数量= 1101984

但根据多个消息来源,正确答案是1098240。

任何人都可以看到我的代码中的错误在哪里吗?

from itertools import combinations
# Generating the deck
deck = []
for i in range(52):
    deck.append(i%13 + 1)

def pairCount(hand):
    paircount = 0
    for i in hand:
        count = 0
        for x in hand:
            if x == i:
                count += 1
        if count == 2:
            paircount += .5 #Adding 0.5 because each pair is counted twice

    return paircount

count = 0
for i in combinations(deck, 5): # loop through all combinations of 5
    if pairCount(i) == 1:
        count += 1

print(count)

1 个答案:

答案 0 :(得分:1)

问题是你的手牌也可以包含以下类型的牌 -

  

三种一对一对

你实际上也在计算这一对。

我修改了代码,只计算手数,使其包含三种类型以及一对一对。代码 -

deck = []
for i in range(52):
    deck.append((i//13 + 1, i%13 + 1))

def pairCount(hand):
    paircount = 0
    threecount = 0
    for i in hand:
        count = 0
        for x in hand:
            if x[1] == i[1]:
                count += 1
        if count == 2:
            paircount += .5 #Adding 0.5 because each pair is counted twice
        if count == 3:
            threecount += 0.33333333
    return (round(paircount, 0) , round(threecount, 0))

count = 0
for i in combinations(deck, 5):
    if pairCount(i) == (1.0, 1.0):
        count += 1

这将数字计为 - 3744

现在,如果我们从您获得的数字中减去这个数字 - 1101984 - 我们会得到您期望的数字 - 1098240