如何生成5门作业0-4分的无重复组合并计算平均值?
实现步骤(Google Sheets)
你需要的是不考虑顺序的可重复评分组合(即按等级出现次数分组,同一组内的排列视为同一组合),可以通过以下公式直接生成所有符合要求的组合及对应平均值:
完整公式
在任意空白单元格(比如A1)输入以下公式:
=LET( // 定义等级与对应分数,可根据实际调整 grades, {"A","B","C","D","E","F"}, scores, {4,3,2,1,0,0}, total_assignments, 5, // 生成所有等级出现次数的合法组合(n_A+n_B+n_C+n_D+n_E+n_F=5) count_pairs, ARRAYFORMULA(QUERY(FLATTEN( SEQUENCE(total_assignments+1,1,0)&","& SEQUENCE(total_assignments+1,1,0)&","& SEQUENCE(total_assignments+1,1,0)&","& SEQUENCE(total_assignments+1,1,0)&","& SEQUENCE(total_assignments+1,1,0) ), "where (split(Col1,',')[0]+split(Col1,',')[1]+split(Col1,',')[2]+split(Col1,',')[3]+split(Col1,',')[4]) <= "&total_assignments&" label Col1 ''")), // 补全F的次数并转为数组 count_array, ARRAYFORMULA({SPLIT(count_pairs, ","), total_assignments - MMULT(SPLIT(count_pairs, ","), SEQUENCE(5,1,1,0))}), // 生成排序后的评分组合字符串(如AAAAF) grade_strings, ARRAYFORMULA( REPT(INDEX(grades,1), INDEX(count_array,,1))& REPT(INDEX(grades,2), INDEX(count_array,,2))& REPT(INDEX(grades,3), INDEX(count_array,,3))& REPT(INDEX(grades,4), INDEX(count_array,,4))& REPT(INDEX(grades,5), INDEX(count_array,,5))& REPT(INDEX(grades,6), INDEX(count_array,,6)) ), // 拆分字符串为5列(对应5门作业) assignment_cols, ARRAYFORMULA(SPLIT(REGEXREPLACE(grade_strings, "(.)", "$1,"), ",")), // 计算每组合的平均值 avg_scores, ARRAYFORMULA(MMULT(count_array, scores)/total_assignments), // 合并结果:5列评分 + 平均值列 {assignment_cols, avg_scores} )
公式说明
- 定义基础数据:
grades是评分等级列表,scores是对应分数,可根据你的实际规则调整(比如如果F是0、E是1,就把scores改成{4,3,2,1,1,0})。 - 生成次数组合:通过嵌套
SEQUENCE生成所有A-E的可能出现次数,再筛选出总和≤5的组合,补全F的次数(total_assignments - 其他等级次数和)。 - 生成评分字符串:用
REPT函数根据次数重复对应等级,拼接成排序后的字符串(确保同一组的排列只会生成一次)。 - 拆分与计算平均值:把字符串拆分成5列对应作业,再通过矩阵乘法
MMULT计算总分数,除以作业数得到平均值。
注意事项
- 公式会生成252行结果(对应组合数C(5+6-1,6-1)=252),如果你的等级数量不同(比如只有A-F中的5个),只需调整
grades和scores数组,公式会自动适配。 - 如果使用Excel,由于函数支持差异,建议用VBA实现,或者简化为生成所有排列后去重(但效率较低)。
内容的提问来源于stack exchange,提问作者Bryce Towle
相关产品推荐
相关产品推荐

