如何在Excel或Python中生成满足双重求和条件的202组4元随机数
首先要明确一个关键问题:你给出的约束存在数学矛盾。202组每组4个数的和为30,那么所有数的总总和应该是 202 * 30 = 6060,但你要求的四个列总和(500+500+300+200)加起来只有1500,远小于6060,这是不可能同时满足的。请先修正列总和的数值,确保四个列总和的和等于6060,否则没有可行解。
假设你已修正列总和为满足总总和要求的数值(记为X_total、Y_total、Z_total、W_total,且X_total+Y_total+Z_total+W_total=6060),以下是两种可行解决方案:
解决方案1:手动调整法(适合理解原理)
先构建满足列总和的矩阵,再调整行和到目标值:
步骤1:生成满足列总和的初始矩阵
以第一列为例:- 在A1:A201单元格中输入公式
=RANDBETWEEN(1, X_total - 201)(减201是保证最后一个数至少为1) - 在A202单元格输入公式
=X_total - SUM(A1:A201),确保第一列总和为X_total - 用同样的方法生成B、C、D列,分别满足各自的列总和要求
- 在A1:A201单元格中输入公式
步骤2:调整每行和为30
- 计算每行的当前和:在E1单元格输入
=SUM(A1:D1),下拉到E202 - 计算每行的偏差:在F1单元格输入
=30 - E1,下拉到F202(所有偏差的总和应为0,因为总总和已匹配) - 调整数值:
- 找到一个F值为正的行(记为行i,需要增加总和)和一个F值为负的行(记为行j,需要减少总和)
- 选择同一列的单元格,比如A列,将A_j减1,A_i加1。这样列总和不变,行i的和加1,行j的和减1,对应F_i减1,F_j加1
- 重复这个操作,直到所有行的F值都为0
- 计算每行的当前和:在E1单元格输入
解决方案2:Excel Solver工具法(高效自动)
Excel的Solver工具可以直接求解同时满足行和与列总和的整数矩阵:
步骤1:启用Solver
如果你的Excel没有显示Solver,点击「文件」→「选项」→「加载项」,在下拉菜单中选择「Excel加载项」,点击「转到」,勾选「规划求解加载项」,确定启用步骤2:设置约束和求解
- 选中A1:D202的单元格区域,作为变量区域
- 打开Solver(一般在「数据」选项卡下):
- 目标:随便选一个单元格(比如A1),选择「值为」并输入任意数值(我们只需要可行解,不需要优化目标)
- 可变单元格:选择A1:D202
- 约束条件:
- 添加约束:
$A$1:$D$202 >= 1(如果需要上限,可添加$A$1:$D$202 <= 100) - 添加约束:
$A$1:$A$202 = X_total(替换为第一列的目标总和) - 添加约束:
$B$1:$B$202 = Y_total(第二列目标总和) - 添加约束:
$C$1:$C$202 = Z_total(第三列目标总和) - 添加约束:
$D$1:$D$202 = W_total(第四列目标总和) - 添加约束:
$E$1:$E$202 = 30(E列是每行的和,由=SUM(A1:D1)下拉得到)
- 添加约束:
- 求解方法:选择「演化」(涉及整数约束,GRG非线性可能无法求解)
- 点击「求解」,Solver会自动生成满足所有约束的矩阵
为什么你之前的方法行不通
你先缩放行和到30,此时列总和是随机的;再缩放列总和的话会破坏行和的约束——这两个操作互相影响,无法独立满足双重约束,必须同时考虑行和与列总和的限制条件。
内容的提问来源于stack exchange,提问作者Housefire
相关产品推荐
相关产品推荐

