多次调用函数并获得新结果
calling function multiple times with new results
我想创建一个扑克模拟,创建一定数量的 5 张扑克手牌,看看我需要玩多少手牌才能拿到皇家同花顺...
我写了一个生成 5 张牌的函数,但是当我 运行 这个函数多次时它不起作用 --> 我得到 5*x 张牌,而不是每 5 张牌得到多手
import random
d = []
h = []
def cards():
l1 = ["Herz", "Karo", "Pik", "Kreuz"]
l2 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
for i in range(10):
d.append([])
for k in range(10):
d[k].append(l1[random.randint(0, (len(l1) - 1))])
d[k].append(l2[random.randint(0, (len(l2) - 1))])
for a in d:
if a not in h:
h.append(a)
if len(h) == 5:
break
else:
continue
return h
for i in range(2):
print(cards())
当我 运行 代码时,我得到以下信息:
[['Karo', 8], ['Herz', 5], ['Pik', 13], ['Herz', 12], ['Karo', 3]]
[['Karo', 8, 'Karo', 5], ['Herz', 5, 'Karo', 6], ['Pik', 13, 'Herz',
4], ['Herz', 12, 'Herz', 5], ['Karo', 3, 'Pik', 3], ['Karo', 8,
'Kreuz', 3], ['Karo', 9, 'Kreuz', 3], ['Pik', 13, 'Herz', 10], ['Pik',
6, 'Karo', 11], ['Karo', 2, 'Pik', 13], []]
您的代码当前具有不断追加的全局列表。这几乎肯定不是你想要的。
我建议创建一副纸牌,然后对它们进行抽样 不放回 以获得一手五张纸牌。您可以从一副 52 张牌中获得最多 10 手这样的牌。更好的方法可能是创建一副牌并洗牌,一次挑选 5 张牌,直到它包含的牌少于 5 张。
在任何一种情况下,您都可以让每只手都通过一个函数来测试它是同花还是您想要的任何其他东西。
您需要的所有工具(除非您使用 numpy)都在 itertools
and random
模块中。
首先创建一个全局牌组。没有必要多次执行此操作,因为它会毫无意义地减慢您的速度。牌组不会改变,只是它们的顺序会:
rank = [str(x) for x in range(2, 11)] + list('JQKA')
suit = list('♠♥♦♣')
deck = list(''.join(card) for card in itertools.product(rank, suit))
现在您可以使用此套牌一次生成 1 到 10 手牌,它们之间没有重复的牌。关键是洗牌是原地进行的。您不必每次都重新生成牌组:
def make_hands(cards=5, hands=None):
if hands is None:
hands = len(deck) // cards
if cards * hands > len(deck):
raise ValueError('you ask for too much')
if cards < 1 or hands < 1:
raise ValueError('you ask for too little')
random.shuffle(deck)
result = [deck[cards * i:cards * i + cards] for i in range(hands)]
您可以使用此功能更改所需的每手牌数和每副牌手牌数。假设您还有一个函数来检查手牌是否为同花或未调用 isflush
。你可以这样应用它:
def how_many():
shuffles = 0
hands = 0
while True:
shuffles += 1
cards = make_hands()
for hand in cards:
hands += 1
if isflush(hand):
return shuttles, hands
shuffles, hands = how_many()
print(f'It took {hands} hands with {shuffles} reshuffles to find a flush')
我想创建一个扑克模拟,创建一定数量的 5 张扑克手牌,看看我需要玩多少手牌才能拿到皇家同花顺...
我写了一个生成 5 张牌的函数,但是当我 运行 这个函数多次时它不起作用 --> 我得到 5*x 张牌,而不是每 5 张牌得到多手
import random
d = []
h = []
def cards():
l1 = ["Herz", "Karo", "Pik", "Kreuz"]
l2 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
for i in range(10):
d.append([])
for k in range(10):
d[k].append(l1[random.randint(0, (len(l1) - 1))])
d[k].append(l2[random.randint(0, (len(l2) - 1))])
for a in d:
if a not in h:
h.append(a)
if len(h) == 5:
break
else:
continue
return h
for i in range(2):
print(cards())
当我 运行 代码时,我得到以下信息:
[['Karo', 8], ['Herz', 5], ['Pik', 13], ['Herz', 12], ['Karo', 3]]
[['Karo', 8, 'Karo', 5], ['Herz', 5, 'Karo', 6], ['Pik', 13, 'Herz', 4], ['Herz', 12, 'Herz', 5], ['Karo', 3, 'Pik', 3], ['Karo', 8, 'Kreuz', 3], ['Karo', 9, 'Kreuz', 3], ['Pik', 13, 'Herz', 10], ['Pik', 6, 'Karo', 11], ['Karo', 2, 'Pik', 13], []]
您的代码当前具有不断追加的全局列表。这几乎肯定不是你想要的。
我建议创建一副纸牌,然后对它们进行抽样 不放回 以获得一手五张纸牌。您可以从一副 52 张牌中获得最多 10 手这样的牌。更好的方法可能是创建一副牌并洗牌,一次挑选 5 张牌,直到它包含的牌少于 5 张。
在任何一种情况下,您都可以让每只手都通过一个函数来测试它是同花还是您想要的任何其他东西。
您需要的所有工具(除非您使用 numpy)都在 itertools
and random
模块中。
首先创建一个全局牌组。没有必要多次执行此操作,因为它会毫无意义地减慢您的速度。牌组不会改变,只是它们的顺序会:
rank = [str(x) for x in range(2, 11)] + list('JQKA')
suit = list('♠♥♦♣')
deck = list(''.join(card) for card in itertools.product(rank, suit))
现在您可以使用此套牌一次生成 1 到 10 手牌,它们之间没有重复的牌。关键是洗牌是原地进行的。您不必每次都重新生成牌组:
def make_hands(cards=5, hands=None):
if hands is None:
hands = len(deck) // cards
if cards * hands > len(deck):
raise ValueError('you ask for too much')
if cards < 1 or hands < 1:
raise ValueError('you ask for too little')
random.shuffle(deck)
result = [deck[cards * i:cards * i + cards] for i in range(hands)]
您可以使用此功能更改所需的每手牌数和每副牌手牌数。假设您还有一个函数来检查手牌是否为同花或未调用 isflush
。你可以这样应用它:
def how_many():
shuffles = 0
hands = 0
while True:
shuffles += 1
cards = make_hands()
for hand in cards:
hands += 1
if isflush(hand):
return shuttles, hands
shuffles, hands = how_many()
print(f'It took {hands} hands with {shuffles} reshuffles to find a flush')