python - 当我需要多次运行 sim 调用函数时避免退出代码 -1073741571 (0xc00000fd)
问题描述
所以我只是在pycharm中编写了一种用于算牌的二十一点模拟。目标是使用完美的基本策略和卡片计数来运行许多手牌,并根据用户的资金和赌注来查看他们输掉所有钱的风险是多少。问题是,为了做到这一点,我需要多次运行二十一点的虚拟手,直到他们失去资金或获利一定数量。他们的每次迭代直到输或赢都由一个函数处理,该函数在 NumberOfSims 范围内为 n。当玩家最终失去所有的钱或利润 x 时,它会转到函数 simwin() 或 simlost() ,其中循环停止,并且 NumberOfSims 范围内 for n 中的下一个值重置资金并循环函数,直到他们再次获得到 simwin() 或 simlost()。我得到了最大递归错误并使用了更高的递归限制。然后我得到了错误:python进程以退出代码-1073741571(0xc00000fd)完成。我找到了这个进程以退出代码 -1073741571 完成,其中提到更改线程大小,但我对此仍然有点陌生,不明白它是否适用于我的情况以及如何使用它。
这是我的代码的基本版本。
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()
我省略了实际控制游戏的函数,例如玩家在庄家击球时击球和 ETC,但这基本上是代码流。它必须经过多次手牌,因为通常资金为 5000 左右,玩家的最大赌注为 20 左右,因此玩家需要很长时间才能完全输掉或盈利。
解决方案
所以我想出了如何通过更多的迭代来做到这一点。我创建了一个变量simIsDone,然后在main函数,playgame()的末尾定义了所有的函数比如hit() Stand()等,我放了一会儿simIsDone == 0: playgame() 然后我去掉了所有函数对 playgame() 的调用,而不是 for n in range。然后,每当您在最后使用 simwin() 获胜或使用 simlost() 失败时,我都会将 simIsDone = 1 这将停止 while 循环,这意味着您要么获利,要么损失所有资金。然后结果 for n in range 循环将检查我们是否已完成所有模拟,如果我们还有更多工作要做,那么我们设置 simIsDone = 0 然后转到 playgame() ,其中 for 循环将再次接管,直到发生了利润或损失。以下是为此解决方案修复的代码注意:对于这个基本的最小代码,它仍然会出现错误,因为任何一手牌都有 50% 的机会输或赢,所以如果你将利润设置得太高,从数学上讲,你永远不可能赢,因此只有这样结束每次迭代都是如果你失去所有的钱。因此,您有可能最终领先一大堆,但由于设定的利润如此之高,您可能会在连续输赢的情况下继续抽牌,因此永远不会达到 bankroll == 0 或 bankroll >= profit + ogbankroll
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()
推荐阅读
- swift - 删除 SKVideoNode 不会停止来自视频节点的音频
- python - 使用 Selenium-Python 通过 WebDriver 上传图像
- aws-lambda - 是否可以通过 aws serverless 进行状态为 200 的空响应?
- asp.net-core - 我们可以让 ActionFilter 扩展 Enum
asp核心2 - python - 即使在docker中添加文件后也找不到文件
- python-3.x - 如何在opengl / pyglet中使用HUD缩放相机?
- python-3.x - ImportError:升级到 Python 3.6 后无法导入名称“_AES”
- r - 为什么我的图例在我的 geom_line 应该是红色的时候使用紫色?
- java - 使用 dynamodb 映射器的 Dynamodb 版本未按预期工作
- matlab - 从 mp3 文件中去除噪音,MATLAB