kwangon 发表于 前天 11:23

笨办法生成矩阵

如题,经过多次尝试,终于用笨办法生成一个3X3矩阵。
# 定义一个循环
while True:
    list_1 = random.sample(range(20), 3)
    list_2 = random.sample(range(20), 3)
    list_3 = random.sample(range(20), 3)
    # 定义一个判断
    if sum(list_1) == sum(list_2) == sum(list_3):# 如果三数和相等
      print('good')
      # 如果三列的和相等
      if list_1 + list_2 + list_3 == list_1 + list_2 + list_3 == list_1 + list_2 + list_3:
            print(list_1)
            print(list_2)
            print(list_3)
            break
后来把这段代码贴在元宝上,发现还有更多,更简洁高效的方法。

FishC 发表于 前天 11:25

首先,感谢你分享你的代码!你通过循环和条件判断来生成矩阵,这是一个很好的尝试。不过,代码中有一个小错误:检查列和的部分写错了,应该分别计算每列的和。

修正后的笨办法代码:


import random

while True:
    list_1 = random.sample(range(20), 3)
    list_2 = random.sample(range(20), 3)
    list_3 = random.sample(range(20), 3)
   
    # 检查行和是否相等
    if sum(list_1) == sum(list_2) == sum(list_3):
      # 检查列和是否相等
      col1_sum = list_1 + list_2 + list_3
      col2_sum = list_1 + list_2 + list_3
      col3_sum = list_1 + list_2 + list_3
      if col1_sum == col2_sum == col3_sum:
            print('找到满足条件的矩阵:')
            print(list_1)
            print(list_2)
            print(list_3)
            break


这个办法确实“笨”,因为它依赖随机尝试,效率很低。更高效的方法是使用构造法。例如,对于3x3矩阵,我们可以先固定一个和S,然后生成矩阵使得每行每列的和都是S。这里有一个简单构造方法:


import random

def generate_matrix(S=30):
    # 生成第一行
    a = random.randint(0, S)
    b = random.randint(0, S - a)
    c = S - a - b
   
    # 生成第二行,考虑列和
    d = random.randint(0, S - a)
    e = random.randint(0, S - b)
    f = S - d - e
   
    # 计算第三行,使得每列和为S
    g = S - a - d
    h = S - b - e
    i = S - c - f
   
    # 检查第三行和是否为S,且数字在0到20之间
    if g + h + i == S and all(0 <= x <= 20 for x in ):
      return [, , ]
    else:
      return None

matrix = None
while matrix is None:
    matrix = generate_matrix()

print('构造的矩阵:')
for row in matrix:
    print(row)


这个方法直接构造矩阵,避免了随机循环,效率更高。当然,你可以调整S和数字范围来满足需求。

希望这能帮助你!继续加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

kwangon 发表于 前天 11:32

FishC 发表于 2026-1-3 11:25
首先,感谢你分享你的代码!你通过循环和条件判断来生成矩阵,这是一个很好的尝试。不过,代码中有一个小错 ...

这个方法很好,一目了然,对于初学者简单易懂。感谢!

FishC 发表于 前天 11:32

kwangon 发表于 2026-01-03 11:32
FishC 发表于 2026-1-3 11:25
首先,感谢你分享你的 ...

不客气!你提到的笨办法是很多初学者都会尝试的路径——先用直观但可能低效的方法解决问题,然后再寻找优化方案。这其实是学习编程最好的方式之一。看到你能从自己的尝试中总结并对比其他方法,说明你已经走在了高效学习的道路上。

关于矩阵生成,这里再补充一个更通用的思路,或许能给你带来启发:

**“先固定框架,再填充内容”**
很多时候,构造问题的解(比如这里的矩阵)可以遵循这个模式。就像我们之前的方法,先确定行和列的总和(S),再分配数值。这种方法不仅效率高,而且代码逻辑更清晰。

对于矩阵或更复杂的结构,当你需要它们满足某些条件时(比如行和列相等),一个有效的策略是:
1. 明确约束条件(如总和相等、数值范围等)
2. 设计算法满足主要约束(比如先保证所有行和相等)
3. 逐步添加其他约束(再调整列和)
4. 最后检查和调整

这种方法远比完全随机的“试错”要高效得多。

**一些学习建议:**
当你掌握基础后,可以尝试:
- 学习NumPy库(专门用于矩阵和科学计算)
- 探索回溯算法(适合解决数独、八皇后等约束满足问题)
- 尝试自己设置更复杂的矩阵条件(比如对角线也要求和相等)

你已经迈出了很棒的一步!保持这种探索精神,继续加油!如果还有其他问题,随时来问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 笨办法生成矩阵