二十一点数学函数

时间:2015-08-09 19:07:05

标签: python algorithm function math

我正在尝试编写一个数学函数来计算获胜或失去玩家的概率。

假设我们只用一副牌(52张牌)玩二十一点,第一个示例牌是这样的:

The player has `7 and 5`
Dealer has `6`

这里我需要计算玩家stands,经销商获胜的可能性是什么?

如果总卡值为17 <= x <= 21

,则经销商可以获胜

我可以用这样的代码来计算这个,但这对6个套牌来说非常低效。

def subset_sum(numbers, target, target2, partial=[]):
    s = sum(partial)
    # check if the partial sum is equals to target
    if s >= target and s <= target2: 
         print partial
    if s >= target:
         return  # if we reach the number why bother to continue
    for i in range(len(numbers)):
        n = numbers[i]
        remaining = numbers[i+1:]
        subset_sum(remaining, target, target2, partial + [n])

我正在寻找一个计算概率并将其返回的数学函数。

def get_prob(deck, small_number, big_number):

return prob

在我们的示例中,经销商有6个如此之小的数字17-6=11而且大数字是21-6=15

5,6,7在第一手使用,所以我的套牌现在就像这样:

dec = [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]

有了这些数字, dealer has 6 so small number is 17-6 = 11 and 21-6 = 15

def get_prob(dec,11,15):

return prob

问题:卡的总和在11到15之间的概率是多少?

1 个答案:

答案 0 :(得分:0)

正如我在my last answer to one of your Blackjack questions中发布的那样,对于您的特定设置,这在算法上并不是必需的,正如我在上一个问题中所理解的那样。

这是一种简单的排列应用。然而,由于没有办法预测下一次交易后仍然存在的概率,因此计算远期的数据没有意义,因为玩家将无法影响任何深度的结果。计算一次一个概率计算简单。

如果你有一个套牌:

deck = [1,1,1,1,2,2,2,3,3...]

可以使用以下方法获得以范围内的总和结束的概率:

def get_prob(deck, minimum, maximum):
  counts = [deck.count(i) for i in range(14)]
  return sum(counts[minimum:maximum+1])/len(counts)

简单来说,这个功能,给定一个牌组和一系列可接受的牌值,将返回卡在这些门槛内被抽出的概率。

此外,如果最小值为11,例如,不计算aces,则无需使用此函数,因为无论如何都需要进行抽奖。