import random random.seed(10) class Deck: def init(self): ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] suits = ['C', 'D', 'H', 'S'] self.deck = [s + r for s in suits for r in ranks] random.shuffle(self.deck) def hand(self, n=1): #拿一手牌,n张 hand = [self.deck[i] for i in range(n)] del self.deck[:n] return hand def deal(self, cards_per_hand, no_of_players): #发牌,cards_per_hand:每个人发牌数, no_of_players:人数 return [self.hand(cards_per_hand) for i in range(no_of_players)] def str(self): return str(self.deck) def same_rank(hand, n_of_a_kind): #分析牌有对或者3-4个 #hand:一手牌,n_of_a_kind:2~4 寻找相同牌面有这么多的牌 ranks = [card[1:] for card in hand] counter = 0 already_counted = [] for rank in ranks: if rank not in already_counted and \ ranks.count(rank) == n_of_a_kind: counter += 1 already_counted.append(rank) return counter def same_suit(hand): #统计同花牌数量 suits = [card[0] for card in hand] counter = {} # counter[suit]存放suit花色的数量 for suit in suits: count = suits.count(suit) if count > 1: #只记录花色数大于1的 counter[suit] = count return counter N=100000 #实验次数 #计算五张牌中正好两对的概率 def prob_two_pairs(): #----------begin----------- #----------end----------- #五张牌中有四张或五张同一花色的牌的概率 def prob_same_suit(): #----------begin----------- #----------end----------- #计算五张牌中有四张牌面数字相同的牌(四条)的概率 def prob_fourofakind(): #----------begin----------- #----------end----------- print('五张牌中正好两对的概率:%.5f' %prob_two_pairs()) print('五张牌中有四张或五张同一花色的牌的概率:%.5f' %prob_same_suit()) print('五张牌中有四张牌面数字相同的牌(四条)的概率:%.5f' %prob_fourofakind())请补全代码
时间: 2023-08-27 08:15:21 浏览: 201
import random
random.seed(10)
class Deck:
def __init__(self):
ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
suits = ['C', 'D', 'H', 'S']
self.deck = [s + r for s in suits for r in ranks]
random.shuffle(self.deck)
def hand(self, n=1): #拿一手牌,n张
hand = [self.deck[i] for i in range(n)]
del self.deck[:n]
return hand
def deal(self, cards_per_hand, no_of_players): #发牌,cards_per_hand:每个人发牌数, no_of_players:人数
return [self.hand(cards_per_hand) for i in range(no_of_players)]
def __str__(self):
return str(self.deck)
def same_rank(hand, n_of_a_kind): #分析牌有对或者3-4个 #hand:一手牌,n_of_a_kind:2~4 寻找相同牌面有这么多的牌
ranks = [card[1:] for card in hand]
counter = 0
already_counted = []
for rank in ranks:
if rank not in already_counted and \
ranks.count(rank) == n_of_a_kind:
counter += 1
already_counted.append(rank)
return counter
def same_suit(hand): #统计同花牌数量
suits = [card[0] for card in hand]
counter = {} # counter[suit]存放suit花色的数量
for suit in suits:
count = suits.count(suit)
if count > 1: #只记录花色数大于1的
counter[suit] = count
return counter
N=100000 #实验次数
#计算五张牌中正好两对的概率
def prob_two_pairs():
count = 0
for i in range(N):
d = Deck()
hand = d.hand(5)
if same_rank(hand, 2) == 2:
count += 1
return count / N
#五张牌中有四张或五张同一花色的牌的概率
def prob_same_suit():
count = 0
for i in range(N):
d = Deck()
hand = d.hand(5)
suits = same_suit(hand)
if 4 in suits.values() or 5 in suits.values():
count += 1
return count / N
#计算五张牌中有四张牌面数字相同的牌(四条)的概率
def prob_fourofakind():
count = 0
for i in range(N):
d = Deck()
hand = d.hand(5)
if same_rank(hand, 4) == 1:
count += 1
return count / N
print('五张牌中正好两对的概率:%.5f' %prob_two_pairs())
print('五张牌中有四张或五张同一花色的牌的概率:%.5f' %prob_same_suit())
print('五张牌中有四张牌面数字相同的牌(四条)的概率:%.5f' %prob_fourofakind())
阅读全文