所以,我一直在研究John Zelle的Python编程问题。问题在于设计一个基本的二十一点程序,该程序显示了二十一点经销商在他大于17的情况下必须击中的规则将破坏的时间百分比。该计划旨在显示每张初始卡的百分比可能性,因为经销商经常透露他的第一张卡片。
我遇到的问题是,当我用Blackjack表交叉引用它们时,该程序似乎为除Ace和Ten之外的每个值提供了很好的百分比。
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%不同。谁能让我知道问题是什么?
答案 0 :(得分:1)
我看到的最大问题是得分逻辑将循环结束时的Ace计算为“x”的硬值,并且它仍然存在。一旦你有一个ace,每次都会运行“if handAce”行。
它看起来也建立在你只能拥有一个案例的想法上。但是理论上你可以 - 但不太可能 - 如果鞋子有4个套牌就可以获得24个Aces。我已经多次处理过多次A,并且每个都给你一种不同的方式来得分。
我认为没有处理来自一定数量的套牌的卡片(即消费卡片)的罚款。
无论如何,我可能会用更多的oop风格来重做这个来解决这个问题:
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。
答案 1 :(得分:0)
答案是我的程序的百分比基于无限大的甲板鞋,这会改变百分比表。我看的原始表是单层甲板。经过进一步的研究,我发现很多网站都有我的价值观。
话虽如此,谢谢你的帮助。当然,Jonathan Vanasco解决问题的方法更好,更具可扩展性。我是新手,所以很有教育意义。
我觉得有趣的是,无限大的甲板鞋最能影响概率表的边缘。