Python 当我需要多次运行sim卡呼叫功能时,避免退出代码-1073741571(0xc00000fd)

Python 当我需要多次运行sim卡呼叫功能时,避免退出代码-1073741571(0xc00000fd),python,Python,所以我只是在pycharm中编程了一种21点模拟卡计数。我们的目标是使用完美的基本策略和卡片计数,运行多手21点游戏,并根据用户的资金和赌注分布来判断他们损失所有金钱的风险。问题是,为了做到这一点,我需要运行多次虚拟21点之手,直到他们失去他们的资金或他们利润的一个固定数额。它们的每次迭代直到输赢都由一个在NumberOfSims范围内为n的函数来处理。当玩家最终失去所有的金钱或利润x时,它进入函数simwin或simlost,循环停止,n范围内的下一个值NumberOfSims重置资金并循环函

所以我只是在pycharm中编程了一种21点模拟卡计数。我们的目标是使用完美的基本策略和卡片计数,运行多手21点游戏,并根据用户的资金和赌注分布来判断他们损失所有金钱的风险。问题是,为了做到这一点,我需要运行多次虚拟21点之手,直到他们失去他们的资金或他们利润的一个固定数额。它们的每次迭代直到输赢都由一个在NumberOfSims范围内为n的函数来处理。当玩家最终失去所有的金钱或利润x时,它进入函数simwin或simlost,循环停止,n范围内的下一个值NumberOfSims重置资金并循环函数,直到再次到达simwin或simlost。我得到了最大递归错误,并使用了设置更高的递归限制。然后我得到了错误:python进程结束,退出代码为-1073741571 0xc00000fd。我发现它提到了改变螺纹尺寸,但我对它还是有点陌生,不知道它是否适用于我的情况以及如何使用它

这是我的代码的基本版本

import random
import math
import sys
deck = z = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 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]
numberOfSims = 5 # This in the real code is user input
profit = 100 # User input
sys.setrecursionlimit(20000)
bet = 10
bankroll = 100 # User Input
ogbankroll = 100 # User input
simlosses = 0
simwins = 0
def start():
    for n in range(numberOfSims):
        playgame()
    print("Sim wins: ", simwins)
    print("Sim losses: ", simlosses)

def playgame():
    global deck
    global numberOfSims
    global profit
    global bet
    global bankroll

    random.shuffle(deck)
    random.shuffle(deck)
    random.shuffle(deck)
    if bankroll == ogbankroll + profit:
        simwin()
    elif bankroll <= 0:
        simlost()
    else:
        dealerhand = [deck[0], deck[1]]
        playerhand = [deck[2], deck[3]]
        if dealerhand[0] + dealerhand[1] == playerhand[0] + playerhand[1]:
            #Push
            playgame()
        elif dealerhand[0] + dealerhand[1] > playerhand[0] + playerhand[1]:
            # Lost
            bankroll = bankroll - bet
            playgame()
        else: # This else means player wins
            # dealerhand[0] + dealerhand[1] < playerhand[0] + playerhand[1]
            bankroll = bankroll + bet
            playgame()
def simwin():
    global bankroll
    global ogbankroll
    global simwins
    global simlosses
    bankroll = ogbankroll
    simwins = simwins + 1

def simlost():
    global bankroll
    global ogbankroll
    global simwins
    global simlosses
    bankroll = ogbankroll
    simlosses = simlosses + 1


start()

我忽略了一些实际控制游戏的功能,比如玩家击球、庄家击球等等,但这基本上就是代码的流程。它必须通过手多次,因为通常资金大约是5000,玩家的最大赌注大约是20,所以玩家要花很长时间才能全部输掉或获利。

所以我想出了如何通过更多的迭代来做到这一点。我创建了一个变量simIsDone,然后在主函数playgame中,在定义所有函数(如hit Stand等)的末尾,我放置了一个while simIsDone==0:playgame,然后我删除了对playgame的所有函数调用,除了范围内的for n。然后,无论何时你赢了simwin还是输了simlost,最后我都会将simIsDone=1,这将停止while循环,这意味着你要么获利,要么失去所有资金。因此,范围内的for n循环将检查我们是否已经完成了所有模拟,如果我们还有更多的事情要做,那么我们将simIsDone设置为0,然后进入playgame,其中for循环将再次接管,直到出现利润或亏损。下面是此解决方案的固定代码 注意:对于这个基本的最小代码,它仍然会得到错误,因为任何一手牌都有50%的机会输赢,所以如果你将利润设定得太高,那么从数学上讲,你永远不可能赢,因此结束每次迭代的唯一方法是如果你输掉了所有的钱。因此,有可能你最终会领先一大群人,但由于设定利润如此之高,你可能会在连续输赢的情况下继续拉手,因此永远无法获得她的资金==0或资金>=利润+资金

import random
import math
import sys
deck = z = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 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]
numberOfSims = 5
# This in the real code is user input
profit = 5 # User input
sys.setrecursionlimit(20000)
bet = 1
bankroll = 10 # User Input
ogbankroll = 10 # User input
simlosses = 0
simwins = 0
simdone = 0
numberr = 0
def start():
    global simdone
    global numberr
    for n in range(numberOfSims):
        numberr = 0
        simdone = 0
        playgame()
    simdone = 1
    print("Sim wins: ", simwins)
    print("Sim losses: ", simlosses)

def playgame():
    global deck
    global numberOfSims
    global profit
    global bet
    global bankroll
    global numberr

    random.shuffle(deck)
    random.shuffle(deck)
    random.shuffle(deck)
    if bankroll == ogbankroll + profit:
        simwin()
    elif bankroll <= 0:
        simlost()
    else:
        dealerhand = [deck[0], deck[1]]
        playerhand = [deck[2], deck[3]]
        if dealerhand[0] + dealerhand[1] == playerhand[0] + playerhand[1]:
            ab = 1
            #Push

        elif dealerhand[0] + dealerhand[1] > playerhand[0] + playerhand[1]:
            # Lost
            bankroll = bankroll - bet

        else: # This else means player wins
            # dealerhand[0] + dealerhand[1] < playerhand[0] + playerhand[1]
            bankroll = bankroll + bet
    while simdone == 0:
        numberr = numberr + 1
        # print(numberr)
        playgame()

def simwin():
    global bankroll
    global ogbankroll
    global simwins
    global simlosses
    global simdone
    bankroll = ogbankroll
    simwins = simwins + 1
    simdone = 1
def simlost():
    global bankroll
    global ogbankroll
    global simwins
    global simlosses
    global simdone
    bankroll = ogbankroll
    simlosses = simlosses + 1
    simdone = 1


start()

欢迎来到堆栈溢出。请拿着这本书读一读。不要描述你的代码;一般来说,在Python中,将递归解决方案转换为迭代解决方案是一个好主意。。。不明白它是否适用于我的情况至少你可以看到你的代码。想象一下我们的感受!这就是为什么我要一个,而不是你所有的代码,@Chris哦,糟糕,我没有看到,我更新了它,这应该会让你了解它的工作流程。