繁体   English   中英

如何从两个列表中进行唯一随机选择

[英]How do I take UNIQUE random choice from two lists

我有两个定义卡片的列表

values  =  ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2']
marks   =  ['spade', 'hearts', 'diamond', 'club']

我想拥有 12 张独特的卡,所以我的output应该看起来像

('9', 'diamond')
('K', 'hearts')
('Q', 'hearts')
('7', 'spade')
('A', 'diamond')
('3', 'diamond')
('Q', 'diamond')
('3', 'hearts')
('7', 'hearts')
('2', 'diamond')
('2', 'hearts')
('5', 'spade')

我已经使用随机选择来做到这一点,我的代码在这里

count = 0
while count != 12:
    value = random.choice(values)
    mark = random.choice(marks)
    card = Card(value, mark) 
    # I have a class named Card, generate() returns a tuple of mark and value for card
    print(card.generate())
    count += 1

但它并没有为我提供独特的价值。 请让我知道或通过我提供资源,以了解如何通过从两个列表中随机选择来获得独特的价值。

首先,使用itertools.productmarksvalues与实际卡片结合起来,然后就像在现实生活中一样,将卡片堆random.shuffle并将卡片pop到玩家手中。

import itertools, random
cards = list(itertools.product(values, marks))
random.shuffle(cards)
hand = [cards.pop() for _ in range(12)]

同时,这将从堆叠中移除卡片,从而确保卡片在不同玩家的手牌中是唯一的。 如果您不想这样做,请改用random.sample 这样,卡片在一只手内是唯一的,但不是跨手,因为它们保留在堆栈中(在这种情况下,也不需要shuffle步骤):

hand = random.sample(cards, 12)

我建议使用random.sample(population, k)这将从列表中返回一个唯一的kpopulation

但是,为此,您首先需要制作所有卡片,然后将所有卡片放入列表人口中。

另一种解决方案是添加一个列表chosen_cards并实现一个 equals 函数,并在将新的随机卡添加到chosen_cards之前检查chosen_cards

你可以做:

cards = [(v, m) for (v, m) in zip(values * 4, marks * 13)]
random.sample(cards, 12)
# RESULT
[('K', 'diamond'),
 ('K', 'spade'),
 ('3', 'spade'),
 ('6', 'hearts'),
 ('10', 'spade'),
 ('9', 'hearts'),
 ('3', 'club'),
 ('8', 'hearts'),
 ('Q', 'spade'),
 ('Q', 'hearts'),
 ('6', 'club'),
 ('J', 'diamond')]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM