Python 从一副牌中随机生成52张牌,而不会得到重复的牌
这就是我到目前为止所说的:Python 从一副牌中随机生成52张牌,而不会得到重复的牌,python,random,Python,Random,这就是我到目前为止所说的: import time from random import randint Suits = [ ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Joker", "Queen", "King"], #hearts ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Joker", "Queen", "King"], #clubs
import time
from random import randint
Suits = [
["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Joker", "Queen", "King"], #hearts
["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Joker", "Queen", "King"], #clubs
["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Joker", "Queen", "King"], #spades
["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Joker", "Queen", "King"] #diamonds
]
for x in range(0,52):
#selection of random card and suit
Suit = randint(0,3)
Card = randint(0,12)
# prints what card was received from the deck
if Suit == 0:
print("You got a", Suits[0][Card], "of Hearts")
elif Suit == 1:
print("You got a", Suits[1][Card], "of Clubs")
elif Suit == 2:
print("You got a", Suits[2][Card], "of Spades")
else:
print("You got a", Suits[3][Card], "of Diamonds")
这允许我从一副牌中随机生成一张牌53次,但最终我得到了重复的牌。我该如何避免这种情况 如果你真的不需要二维数组,你可以做得更简单一些。如果您只有一个简单的列表,那么可以使用Python的库轻松完成这项工作:
import random
cards = [(s, v) for s in ['H', 'S', 'C', 'D']
for v in [str(i) for i in range(2, 11)] + list("JKQA")]
random.shuffle(cards)
列表理解用于将
卡片
设置为具有套装和等级组合的元组。然后用于随机化卡片列表,这样您就可以迭代/从列表末尾拉出卡片。如果您不需要二维数组,则可以更简单地执行此操作。如果您只有一个简单的列表,那么可以使用Python的库轻松完成这项工作:
import random
cards = [(s, v) for s in ['H', 'S', 'C', 'D']
for v in [str(i) for i in range(2, 11)] + list("JKQA")]
random.shuffle(cards)
import random
import itertools as it
deck = list(it.product("♠♣♥♦", [str(x) for x in range(2, 11)] + list("JQKA")))
random.shuffle(deck)
print(len(deck))
print(deck)
# 52
# [('♠', '6'), ('♦', 'J'), ('♣', '4'), ('♣', '7'), ('♠', '8'), ('♦', 'K'), ...]
列表理解用于将卡片
设置为具有套装和等级组合的元组。然后用于随机化已就位的卡片列表,以便您只需迭代/从列表末尾拉出卡片
import random
import itertools as it
deck = list(it.product("♠♣♥♦", [str(x) for x in range(2, 11)] + list("JQKA")))
random.shuffle(deck)
print(len(deck))
print(deck)
# 52
# [('♠', '6'), ('♦', 'J'), ('♣', '4'), ('♣', '7'), ('♠', '8'), ('♦', 'K'), ...]
或者,使用集合:
deck = set(it.product("♠♣♥♦", {str(x) for x in range(2, 11)} | set("JQKA")))
或者,使用集合:
deck = set(it.product("♠♣♥♦", {str(x) for x in range(2, 11)} | set("JQKA")))
使用记忆辅助工具将值放入一个集合,然后如果该值在集合中,则不会添加该值并选择另一张随机卡,直到所有52张卡都在选择列表中。因此,处理任何重复项
import random
import itertools as it
deck = list(it.product("♠♣♥♦", [str(x) for x in range(2, 11)] + list("JQKA")))
random.shuffle(deck)
# print(len(deck))
# print(deck)
memo = set()
def deal(n):
for i in range(n):
k = random.choice(deck)
if k not in memo:
memo.add(k)
else:
deal(1)
print(len(memo))
return memo
print(deal(52))
你能行
return sorted(memo)
这将返回一个排序列表,以便于视觉确认使用记忆助手将值放入一个集合中,然后如果值在集合中,则不会添加该值并选择另一张随机卡,直到所有52张卡都在选择列表中。因此,处理任何重复项
import random
import itertools as it
deck = list(it.product("♠♣♥♦", [str(x) for x in range(2, 11)] + list("JQKA")))
random.shuffle(deck)
# print(len(deck))
# print(deck)
memo = set()
def deal(n):
for i in range(n):
k = random.choice(deck)
if k not in memo:
memo.add(k)
else:
deal(1)
print(len(memo))
return memo
print(deal(52))
你能行
return sorted(memo)
这将返回一个排序列表,以便于视觉确认您正在寻找的算法称为“洗牌”,您可以按顺序生成它们,然后洗牌吗?此外,只有52种组合,所以根据鸽子洞定理,卡片53上至少应该有一张重复的卡片,必须至少有一张重复的卡片。你正在寻找的算法称为“洗牌”,你能按顺序生成它们,然后洗牌吗?此外,只有52种组合,所以在53张卡片上至少应该有一张重复的卡片。根据鸽子洞定理,必须至少有一张重复的卡片