牌组排列对比验证概率等价性 基于itertools的实现技术求助
牌组排列概率验证实现方案
前置理论确认
首先可以明确第一层结论:X与Z的排列集合必然等价。X是4蓝5红牌组的所有同色不区分排列,而Z是从4蓝6红牌组移除1张红牌得到的排列,剩余牌固定为4蓝5红,因此Z的所有可能排列必然和X完全重合。
你需要验证的第二层结论是:X中所有排列的出现概率(均匀随机排列时每种概率相等),与Z中对应排列的出现概率是否完全一致。
基于itertools的验证代码
直接运行以下代码即可完成两项验证:
import itertools import random from collections import defaultdict # 1. 生成X集合的所有唯一排列,计算理论概率 x_base_deck = ['b'] * 4 + ['r'] * 5 # 用set对permutations结果去重,消除同色牌的排列差异 x_all_perms = set(itertools.permutations(x_base_deck)) x_total_count = len(x_all_perms) x_single_prob = 1 / x_total_count print(f"X集合总排列数:{x_total_count},单种排列理论概率:{x_single_prob:.6f}") # 2. 模拟Z的生成过程,统计各排列出现频率 sim_times = 200000 # 模拟次数越大,概率计算误差越小 z_perm_counter = defaultdict(int) for _ in range(sim_times): # 生成随机打乱的4蓝6红牌组 y_deck = ['b'] * 4 + ['r'] * 6 random.shuffle(y_deck) # 随机移除1张红牌 red_positions = [idx for idx, card in enumerate(y_deck) if card == 'r'] remove_pos = random.choice(red_positions) z_deck = tuple(y_deck[:remove_pos] + y_deck[remove_pos+1:]) z_perm_counter[z_deck] += 1 # 3. 两项验证逻辑 # 集合等价验证 z_all_perms = set(z_perm_counter.keys()) print(f"\n集合等价验证结果:X与Z排列集合是否相等:{x_all_perms == z_all_perms}") # 概率一致性验证 max_prob_error = 0 for perm, count in z_perm_counter.items(): z_single_prob = count / sim_times current_error = abs(z_single_prob - x_single_prob) if current_error > max_prob_error: max_prob_error = current_error print(f"概率一致性验证结果:单种排列最大概率误差:{max_prob_error:.6f}") print(f"是否符合概率一致预期(误差小于0.0005视为一致):{max_prob_error < 0.0005}")
结果说明
- 集合等价验证的结果必然为True,和理论推导完全一致
- 概率误差会随着模拟次数提升不断缩小,当模拟次数达到20万次时,误差通常会低于0.0005,可证明两类排列的出现概率完全一致
内容的提问来源于stack exchange,提问作者Zovc
相关产品推荐
相关产品推荐

