You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

牌组排列对比验证概率等价性 基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:15:07