纸牌游戏的概率计算

问题描述 投票:0回答:1

我有一个Simpel纸牌游戏,目前正在为我的论文进行研究。规则是简单的。您有一副52张牌,从1到10,以及杰克,皇后和骑士。您从卡组中抽出一张卡片。如果是数字,它将被添加到您的帐户中。如果您绘制千斤顶,皇后或骑士,您的帐户将重置为0。每次绘制之后,您都可以决定是否要重新绘制或停止。

对于这个游戏,我在这个站点的帮助下编写了代码。它应该给出绘制精确“目标”的概率。举例来说,抽奖的可能性使您的帐户中有1点,是4/52,因为您有四个1´。程序确实给了我这个值。

But。概率,您的账户中恰好有2分是4/52 + 4/52 * 3/51。您可以绘制2的概率为4/52的1或绘制另外一个1的概率为4/52 * 3/51的图像。这里的代码搞砸了。它计算出您的帐户中恰好有2分的概率为4/52 + 4/52 * 4/51,我不明白为什么?

有人可以帮我吗?

 import collections
 import numpy as np


def probability(n, s, target):
    prev = {0: 1}  # previous roll is 0 for first time
    for q in range(n):
        cur = collections.defaultdict(int)  # current probability
        for r, times in prev.items():
            cards = [i for i in range(1, 11)] * 4
            for i in [i for i in cards]:
                cards.remove(i)
                # if r occurred `times` times in the last iteration then
                # r+i have `times` more possibilities for the current iteration.
                cur[r + i] += times
        prev = cur  # use this for the next iteration
    return (cur[t]*np.math.factorial(s-n)) / (np.math.factorial(s))


if __name__ == '__main__':
    s = 52
    for target in range(1, 151):
        prob = 0

        for n in range(1, 52):
            prob += probability(n, s, target)
        print(prob)

编辑:我很确定,那条线

for i in [i for i in cards]:

是问题。由于cards.remove(i)会删除绘制的卡,但我不在乎,无论如何都可以绘制。

python-3.x numpy probability combinatorics
1个回答
0
投票

对于范围(n)中的q:

您节省了[sum]得出一张卡(p = 0),两张卡(p = 1)等后达到总和的方式。但是,当您设置p = 1时,您不会“记住”在设置时已经抽出的那张卡片

纸牌= [i代表范围(1,11)中的i] * 4

之后。因此,如果您首先绘制了“ 1”(四种可能性),那么您仍然可以从甲板上抽出四个“ 1”,这将为您提供4/52 * 4/51。

作为旁注:如果i == 11,是否应该进行某种检查,因为那会重置您的帐户?

© www.soinside.com 2019 - 2024. All rights reserved.