如何实现random.choice()限制样本最多被选中2次?
解决随机选择中每个样本最多被选中2次的问题
问题分析
原代码的核心问题在于:每次循环先一次性抽取num个样本,再检查累计次数是否超过2。这就导致如果某个样本之前已经被选中1次,在本次抽取中可能被选中2次,最终累计达到3次,违反了最多2次的限制。
修正后的代码
import collections import random # 初始化计数器,记录每个样本被选中的次数 counts = collections.Counter() list_items = ['aa', 'bb', 'cc', 'dd', 'ee'] num_per_draw = 3 # 每次抽取的样本数量 total_draws = 3 # 总抽取次数 for _ in range(total_draws): current_draw = [] for _ in range(num_per_draw): # 筛选出当前还能被选中的样本(累计次数<2) available_items = [item for item in list_items if counts[item] < 2] # 随机选择一个可用样本 selected = random.choice(available_items) current_draw.append(selected) # 立即更新该样本的选中次数 counts[selected] += 1 print(f'本次抽取结果: {current_draw}') print(f'当前各样本累计选中次数: {dict(counts)}')
关键改进点
- 逐次跟踪选中次数:不再等整轮抽取完成后再统计,而是每选中一个样本就立即更新计数器,确保后续选择不会违反次数限制。
- 动态筛选可用样本:每次选择前只保留累计选中次数不足2次的样本,从根源上避免了超次数选择的可能。
- 逻辑更严谨:即使在同一次抽取中,也不会重复选中已达1次的样本超过1次,保证最终每个样本的总选中次数不超过2。
内容的提问来源于stack exchange,提问作者Supergirl Supergirl
相关产品推荐
相关产品推荐

