簡體   English   中英

當我需要多次運行 sim 調用函數時避免退出代碼 -1073741571 (0xc00000fd)

[英]Avoiding exit code -1073741571 (0xc00000fd) when I need to run a sim calling functions many times over

所以我只是在 pycharm 中編寫了一種用於算牌的二十一點模擬。 目標是使用完美的基本策略和卡片計數來運行許多手牌,並根據用戶的資金和賭注來查看他們輸掉所有錢的風險是多少。 問題是,為了做到這一點,我需要多次運行二十一點的虛擬手,直到他們失去資金或獲利一定數量。 他們的每次迭代直到輸贏都由 function 處理,其中 n 在 NumberOfSims 范圍內。 當玩家最終失去所有的錢或利潤 x 時,它會轉到 function 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,但這基本上是代碼流。 它必須多次通過手牌到go,因為通常資金約為5000,玩家的最大賭注為20,因此玩家需要很長時間才能輸掉全部或盈利。

所以我想出了如何通過更多的迭代來做到這一點。 我創建了一個變量simIsDone,然后在主function,playgame()的末尾定義了所有的函數如hit() Stand()等,我放了一會兒simIsDone == 0: playgame() 然后我把ZC1C425268E68385D1AB5074C17A94F14全部去掉對 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM