2

それで、私はJohnZelleによるPythonプログラミングの問題に取り組んできました。問題は、ブラックジャックのディーラーが17を超えるまでヒットしなければならないというルールを前提として、ブラックジャックのディーラーが破産する時間の割合を示す基本的なブラックジャックプログラムを設計することです。ディーラーはしばしば彼の最初のカードを明らかにします。

私が遭遇した問題は、ブラックジャックのテーブルと相互参照すると、プログラムがエースとテンを除くすべての値に対して適切なパーセンテージを与えるように見えることです。

from random import randrange

def main():
    printIntro()
    n = getInput()
    busts = simBlackjack(n)
    printSummary(n, busts)

def printIntro():
    print "Hello, and welcome to Blackjack.py."
    print "This program simulates the likelihood"
    print "for a dealer to bust."

def getInput():
    n = input("How many games do you wish to simulate: ")
    return n

def simBlackjack(n):
    busts = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    for b in range(10):
        for i in range(n):
            x = b + 1
            if b == 0:
                handAce = True
            else: handAce = False
            while x < 17:
                add = randrange(1,14)
                if add == 11:
                    add = 10
                elif add == 12:
                    add = 10
                elif add == 13:
                    add = 10
                elif add == 1:
                    handAce = True
                x = x + add
                if handAce:
                    if x + 10 >= 17 and x + 10 <= 21:
                        x = x + 10

            if x > 21:
                busts[b] = busts[b] + 1

    return busts

def printSummary(n, busts):
    for b in range(10):
        if b == 0:
            print "When the initial card was Ace, the dealer busted %d times in %d games. (%0.1f%%)" % (busts[0], n, (busts[0]) / float(n) * 100)
        else:
            print "When the initial value was %d, the dealer busted %d times in %d games. (%0.1f%%)" % ((b + 1), busts[b], n, (busts[b]) / float(n) * 100)

if __name__ == "__main__": main()

n = 1,000,000の場合、それぞれ約11.5%と21.2%になります。これは、オンラインテーブルが大幅に保持している17%と23%とは異なります。誰かが私に問題が何であるかを教えてもらえますか?

4

2 に答える 2

1

私が目にする大きな問題は、スコアリングロジックがループの最後にあるエースをハード値「x」に計算し、それが持続することです。エースを獲得すると、その「ifhandAce」ラインが毎回実行されます。

また、1つのケースしか持てないという考えに基づいて構築されているように見えます。しかし、理論的には、靴に4つのデッキがある場合、24エースが配られる可能性はありません。私は何度もエースを配られてきましたが、それぞれがデッキを獲得するための異なる方法を提供します。

設定された数のデッキからのカードのセットを扱わない(つまり、カードを消費する)のは問題ないと思います。

とにかく、私はおそらくエースの問題を解決するためにもう少しおっとスタイルでこれをやり直すでしょう:

class BlackjackHand(object):
    cards= None

    def __init__(self):
        self.cards = []

    def autoplay(self,initial_card=None):
        if initial_card:
            self.cards.append(initial_card)
        return self.calculate()

    def calculate(self):
        total = 0
        for card in self.cards:
            ## compute!
        return total

私はまた、物事をきれいに見せるために、おそらく顔自体を扱います:

faces = [ str(i) for i in (1,2,3,4,5,6,7,8,9,10,'j','q','k','a') ]
def facevalue(face):
    if face.isdigit():
        return ( int(face) , 0 )
    if face in ('j','q','k'):
        return ( 10 , 0 )
    if face == 'a':
        return ( 1 , 1 )

このようにあなたはすることができます...

def simBlackjack(n):
    for face in faces:
        for i in range(n):
            hand = BlackjackHand()
            score = hand.autoplay(initial_card=face)

そして、次のようなもので計算します...

( hand , aces ) = facevalue( face )
while True:
    new_card  = random.choice( faces )
    ( new_card_value , new_card_is_ace ) = facevalue( new_card )
    hand += new_card_value
    aces += new_card_is_ace
    # calculate the multiple different scoring possibilities 
    # if all of them bust, then break

そこには他の問題があるかもしれませんが、私にとって大きな明らかな問題は、コードがAcesを十分にサポートしていないことです。

于 2012-09-12T01:21:12.883 に答える
0

答えは、私のプログラムのパーセンテージは、パーセンテージテーブルを変更する無限に大きなデッキシューズに基づいているということでした。私が見ていた元のテーブルはシングルデッキ用でした。さらに調査した結果、自分の価値観を正確に反映したサイトがたくさん見つかりました。

そうは言っても、あなたのすべての助けに感謝します。確かに、問題に取り組むJonathan Vanascoの方法は、より優れていて、よりスケーラブルでした。私は初心者なのでとても教育的でした。

無限に大きいデッキシューズが確率表のフリンジに最も影響を与えるのは興味深いことだと思います。

于 2012-09-12T12:48:46.623 に答える