import random from collections import Counter # 初始化扑克牌,生成52张牌,不包括大小王 suits = ['H', 'D', 'S', 'C'] # Hearts, Diamonds, Spades, Clubs values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] deck = [v + s for s in suits for v in values] # 牌型判断函数 def is_bomb(cards): # 判断是否为豹子(炸弹),三张点相同的牌 return cards[0][:-1] == cards[1][:-1] == cards[2][:-1] def is_straight_flush(cards): # 判断是否为顺金(同花顺),花色相同的顺子 return is_flush(cards) and is_straight(cards) def is_flush(cards): # 判断是否为金花(色皮),花色相同,非顺子 return cards[0][-1] == cards[1][-1] == cards[2][-1] def is_straight(cards): # 判断是否为顺子(拖拉机),花色不同的顺子 values = sorted(['23456789TJQKA'.index(c[:-1]) if c[:-1] != '10' else 8 for c in cards]) return values == list(range(values[0], values[0] + 3)) def is_pair(cards): # 判断是否为对子,两张点数相同的牌 values = [c[:-1] for c in cards] return len(set(values)) == 2 def is_special(cards): # 判断是否为特殊牌型,花色不同的235 values = sorted(['23456789TJQKA'.index(c[:-1]) if c[:-1] != '10' else 8 for c in cards]) suits = set(c[-1] for c in cards) return values == [0, 1, 2] and len(suits) == 3 def get_hand_type(cards): # 获取牌型的类型 if is_special(cards): return '特殊' if is_bomb(cards): return '豹子' if is_straight_flush(cards): return '顺金' if is_flush(cards): return '金花' if is_straight(cards): return '顺子' if is_pair(cards): return '对子' return '单张' # 三张牌不组成任何类型的牌,单张 # 模拟游戏并统计结果 results = Counter() # 模拟10000次游戏 for _ in range(10000): # 洗牌 random.shuffle(deck) # 发牌,每位玩家3张牌 player1 = deck[:3] player2 = deck[3:6] # 统计每位玩家的牌型 results[get_hand_type(player1)] += 1 results[get_hand_type(player2)] += 1 # 计算概率 total_hands = 20000 # 两个玩家,每人10000次 probabilities = {hand: count / total_hands for hand, count in results.items()} # 输出结果 for hand, prob in probabilities.items(): print(f"{hand}: {prob:.4f}")