Python随机采样生成女性占多数的5人委员会时重复组问题求助
问题排查与解决方案
嘿,我来帮你搞定这个去重失效的问题~
为什么你的去重代码没起作用?
你现在的代码里用列表a来判断if a in combinations,但这里有两个核心问题:
- 委员会是「组合」而非「排列」:
random.sample返回的列表顺序是随机的,比如["l1", "l2", "m1"]和["l2", "l1", "m1"]其实是同一个委员会,但你的代码会把它们当成两个不同的列表存进去,根本没做到真正的去重。 - 列表的成员判断效率低且易出错:即使是完全相同的元素列表,作为不同的列表对象,虽然
in能判断,但10000次循环下这种方式效率极低,而且本质上没解决顺序导致的重复问题。
修复方案:用「排序元组+集合」实现高效去重
我们可以把抽样得到的委员会转换成排序后的元组(元组是不可变类型,可以存入集合),再用集合自动去重的特性来处理,这样不管抽样顺序如何,同一个组合只会被存一次。
修改后的代码如下:
import random people = ["m1", "m2", "m3","m4", "m5", "m6" , "m7","m8", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9"] unique_committees = set() # 用集合存,自动去重 for _ in range(10000): a = random.sample(people, k=5) # 优化女性数量统计:不用逐个count,用生成器表达式更简洁 female_count = sum(1 for person in a if person.startswith('l')) if female_count >= 3: # 先排序再转元组,消除顺序影响 committee = tuple(sorted(a)) unique_committees.add(committee) print(len(unique_committees))
额外优化:直接用组合数学计算准确结果
其实如果你的目标是计算符合条件的委员会总数,根本不需要随机抽样,用组合数公式直接计算更准确高效:
符合条件的情况是女性3人+男性2人、女性4人+男性1人、女性5人+男性0人,对应的组合数之和为:
import math # 计算组合数C(n,k) def comb(n, k): return math.comb(n, k) if k <=n else 0 total = comb(9,3)*comb(8,2) + comb(9,4)*comb(8,1) + comb(9,5)*comb(8,0) print(total) # 输出结果是 1596
这个结果是精确的,不需要依赖随机抽样的次数,也不会有误差。
内容的提问来源于stack exchange,提问作者hjjinx
相关产品推荐
相关产品推荐

