我有一个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)会删除绘制的卡,但我不在乎,无论如何都可以绘制。
对于范围(n)中的q:
您节省了[sum]得出一张卡(p = 0),两张卡(p = 1)等后达到总和的方式。但是,当您设置p = 1时,您不会“记住”在设置时已经抽出的那张卡片纸牌= [i代表范围(1,11)中的i] * 4
之后。因此,如果您首先绘制了“ 1”(四种可能性),那么您仍然可以从甲板上抽出四个“ 1”,这将为您提供4/52 * 4/51。作为旁注:如果i == 11,是否应该进行某种检查,因为那会重置您的帐户?