如何计算10个因子(各含15个值)的所有3分组变体?
实现方案:生成不重复3因子分组的全取值组合
首先先纠正一个计算上的小误区:你提到的「10个因子中所有不重复的3因子分组」,如果是要排除因子重复出现的情况(比如factor1、factor1、factor2这种),那正确的分组数应该是:
- 若不考虑因子顺序(比如
(factor1,factor2,factor3)和(factor2,factor1,factor3)算同一组):组合数C(10,3) = 120种 - 若考虑顺序(三个位置的因子顺序不同算不同分组,对应你输出格式里的「第一/第二/第三位置」):排列数
P(10,3) = 10×9×8 = 720种
而你之前写的 3^10=59049 是允许因子重复出现的情况(每个位置都能选10个因子,包括重复),如果是这种需求也可以实现,下面会分别覆盖场景。
方案一:Python 实现(推荐,灵活易维护)
Python的itertools模块可以轻松处理笛卡尔积和排列/组合,而且支持边生成边写入文件,避免内存溢出问题。
代码示例(考虑因子顺序的排列场景)
import itertools # 定义10个因子 factors = [f"factor{i}" for i in range(1, 11)] # 每个因子的取值范围(1-15) values = range(1, 16) # 生成所有不重复的3因子有序排列(三个因子各不相同) factor_permutations = itertools.permutations(factors, 3) # 直接写入文件,避免终端输出卡顿 with open("factor_combinations.txt", "w") as f: for factor_tuple in factor_permutations: # 生成当前3因子分组下的所有取值组合 value_combinations = itertools.product(values, repeat=3) for value_tuple in value_combinations: # 按要求格式拼接成一行 line = " ".join(factor_tuple) + " " + " ".join(map(str, value_tuple)) f.write(line + "\n")
如果是不考虑顺序的组合场景
只需要把itertools.permutations换成itertools.combinations即可:
factor_combinations = itertools.combinations(factors, 3)
若需要允许因子重复的场景(即59049种分组)
把排列/组合替换为itertools.product(factors, repeat=3),这时候总记录数会达到~1.99亿,建议加入进度条(比如tqdm模块),同时确保磁盘有足够空间(每行约30字节,1.99亿行大概占60GB)。
方案二:Shell 脚本实现(适合无Python环境的场景)
用seq生成取值,通过嵌套循环处理因子和取值的组合:
代码示例(考虑因子顺序的排列场景)
#!/bin/bash # 定义因子列表 factors=("factor1" "factor2" "factor3" "factor4" "factor5" "factor6" "factor7" "factor8" "factor9" "factor10") # 取值范围(1-15) values=$(seq 1 15) # 遍历所有不重复的3因子有序组合 for i in "${!factors[@]}"; do for j in "${!factors[@]}"; do if [ $i -eq $j ]; then continue; fi for k in "${!factors[@]}"; do if [ $k -eq $i ] || [ $k -eq $j ]; then continue; fi # 获取三个因子 f1=${factors[$i]} f2=${factors[$j]} f3=${factors[$k]} # 遍历所有取值组合并输出 for v1 in $values; do for v2 in $values; do for v3 in $values; do echo "$f1 $f2 $f3 $v1 $v2 $v3" done done done done done done > factor_combinations.txt
注意事项
- Shell脚本处理1.99亿条记录会非常缓慢,仅推荐用于分组数较少的场景(比如排列或组合的情况)。
- 输出直接重定向到文件,避免终端输出拖慢执行速度。
内容的提问来源于stack exchange,提问作者Semyon-coder
相关产品推荐
相关产品推荐

