鱼C论坛

 找回密码
 立即注册
查看: 33|回复: 3

[学习笔记] 笨办法生成矩阵

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,经过多次尝试,终于用笨办法生成一个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[0] + list_2[0] + list_3[0] == list_1[1] + list_2[1] + list_3[1] == list_1[2] + list_2[2] + list_3[2]:
            print(list_1)
            print(list_2)
            print(list_3)
            break
后来把这段代码贴在元宝上,发现还有更多,更简洁高效的方法。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

修正后的笨办法代码:


  1. import random

  2. while True:
  3.     list_1 = random.sample(range(20), 3)
  4.     list_2 = random.sample(range(20), 3)
  5.     list_3 = random.sample(range(20), 3)
  6.    
  7.     # 检查行和是否相等
  8.     if sum(list_1) == sum(list_2) == sum(list_3):
  9.         # 检查列和是否相等
  10.         col1_sum = list_1[0] + list_2[0] + list_3[0]
  11.         col2_sum = list_1[1] + list_2[1] + list_3[1]
  12.         col3_sum = list_1[2] + list_2[2] + list_3[2]
  13.         if col1_sum == col2_sum == col3_sum:
  14.             print('找到满足条件的矩阵:')
  15.             print(list_1)
  16.             print(list_2)
  17.             print(list_3)
  18.             break
复制代码


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


  1. import random

  2. def generate_matrix(S=30):
  3.     # 生成第一行
  4.     a = random.randint(0, S)
  5.     b = random.randint(0, S - a)
  6.     c = S - a - b
  7.    
  8.     # 生成第二行,考虑列和
  9.     d = random.randint(0, S - a)
  10.     e = random.randint(0, S - b)
  11.     f = S - d - e
  12.    
  13.     # 计算第三行,使得每列和为S
  14.     g = S - a - d
  15.     h = S - b - e
  16.     i = S - c - f
  17.    
  18.     # 检查第三行和是否为S,且数字在0到20之间
  19.     if g + h + i == S and all(0 <= x <= 20 for x in [a, b, c, d, e, f, g, h, i]):
  20.         return [[a, b, c], [d, e, f], [g, h, i]]
  21.     else:
  22.         return None

  23. matrix = None
  24. while matrix is None:
  25.     matrix = generate_matrix()

  26. print('构造的矩阵:')
  27. for row in matrix:
  28.     print(row)
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个方法很好,一目了然,对于初学者简单易懂。感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
kwangon 发表于 2026-01-03 11:32
FishC 发表于 2026-1-3 11:25
首先,感谢你分享你的 ...


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

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-3 16:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表