Python中random.choices权重相等元素数量不均,如何生成等数量随机列表?
如何生成元素出现次数完全相等的随机列表?
问题描述
我希望生成一个包含指定元素的随机列表,要求最终列表中每个元素的出现次数完全相同。尝试用random.choices设置相等权重,但结果次数不稳定,示例代码如下:
>>> set_sizes = [0, 3, 6, 12] >>> target_list = random.choices(set_sizes, weights = [1, 1, 1, 1], k= 40) >>> print (target_list.count(0), target_list.count(3), target_list.count(6), target_list.count(12)) 8 10 12 10
原本期望每个元素出现10次,但实际结果波动较大,请问如何修改代码实现次数完全相等?
解决方案
random.choices是有放回抽样,即使权重相等,也无法保证每个元素的抽取次数严格一致。要实现次数完全相等,可采用「先构造固定次数的列表,再随机打乱」的思路:
- 计算每个元素需要重复的次数:总长度
k除以元素数量,确保k能被元素个数整除(如示例中40÷4=10)。 - 构造基础列表,每个元素重复对应次数。
- 使用
random.shuffle打乱列表顺序,得到随机且次数均等的结果。
代码示例:
import random set_sizes = [0, 3, 6, 12] total_length = 40 # 计算每个元素的出现次数 per_element_count = total_length // len(set_sizes) # 生成包含指定次数元素的基础列表 result_list = [] for num in set_sizes: result_list += [num] * per_element_count # 随机打乱列表顺序 random.shuffle(result_list) # 验证次数(结果必为10 10 10 10) print(result_list.count(0), result_list.count(3), result_list.count(6), result_list.count(12))
补充说明
如果总长度k无法被元素个数整除,可根据需求调整:要么调整k为可整除的数值,要么对部分元素多分配一次次数(需额外逻辑处理)。
内容的提问来源于stack exchange,提问作者shinoop
相关产品推荐
相关产品推荐

