从一副牌中随机生成52张牌而不获得副本

2024-05-01 22:32:23 发布

您现在位置:Python中文网/ 问答频道 /正文

到目前为止,我得出的结论是:

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次,但最终我得到了重复的。我该怎么避免呢?在


Tags: offromimportyourandomcardprintace
3条回答
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'), ...]

或者,使用集合:

^{pr2}$

如果不需要二维数组,可以更简单地执行此操作。如果您只是有一个简单的列表,那么可以使用Python的random库轻松完成此操作:

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)

列表理解用于将cards设置为具有套装和等级组合的元组。然后使用^{}随机化卡片列表,这样您就可以从列表的末尾迭代/拉出卡片。在

使用记忆助手将值放入一个集合中,然后如果值在集合中,它将不会添加它,并选择另一个随机卡,直到所有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))

你能做到的

^{pr2}$

这将返回一个排序的列表,以便于视觉确认

相关问题 更多 >