【问题标题】:Generate matrix NxN where average of row is in row and avrage of column is in column生成矩阵 NxN,其中行的平均值在行中,列的平均值在列中
【发布时间】:2020-09-14 04:32:12
【问题描述】:

我正在解决一些 python 问题,并且一直在努力解决这个任务。我需要生成填充自然数的矩阵 N x N,其中:

  • 每行数字的平均值是自然数,存在于 那一行
  • 每列数字的平均值是自然数,即 出现在该列中
  • 矩阵中的所有数字都不同

到目前为止,我已经生成了矩阵并尝试使用random.choice,但我没有看到一种方法来处理它,以便行和列在该行/列中都有平均值。

这是我的代码:

import random
used_numbers = []
matrix = []
matrix_done = False
rows_generated = 0

n = int(input("please enter number for nxn matrix: "))
start = 1
max_n = n

while(matrix_done is False):
    row = random.sample(range(start, max_n + 1), n)
    average = sum(row) / len(row)
    print("row", row, average)
    start = max_n + 1
    max_n = max_n + n

    print("start***", start, max_n)

    matrix.append(row)

    if(average > 0 and average.is_integer()):
        print("is integer true")
        rows_generated += 1

    if(rows_generated == n):
        matrix_done = True

for row in matrix:
    print(row)

【问题讨论】:

    标签: python matrix


    【解决方案1】:

    我使用以下原理创建了以下代码:

    • 如果 n 是偶数:它只是一个算术级数
    • 如果 n 是奇数:我们必须补偿每行、每列和最后一个元素的最后一个元素,以确保平均值在矩阵内

    我将起点定义为 10,以便轻松检查结果。但如果你愿意,你可以让它从任何给定的随机数开始。

    import random
    import numpy as np
    
    # Get user inputs
    n = int(input("please enter number for nxn matrix: "))
    s =  10 # First element in the matrix. Can use random.randint(1, 100)
    r = 2 # Arithmetic progression ratio
    c = n*(r + 1) # How much change from one line to another. Use it to avoid having the same numbers
    
    # Now we have to scenarios: the calculation is done differently if n is iven or odd
    if (n % 2 == 0):
        elements = []
        for i in range(n):
            for j in range(n):
                e = s + r*j + c*i
                
                if j == n - 1 and i == n - 1: # Last element of the matrix
                    e += c*n/2 + n
                elif j == n - 1: # last element of the line
                    e += r*n/2
                elif i == n - 1: # last element of the column
                    e += c*n/2
                else:
                    pass
                elements.append(e)
    
    else:
        # If the number is even, we just need to create an arithmetic progression and reshape it into a matrix
        elements = [s + r*i for i in range(n*n)]
    
    matrix = np.reshape(elements, (n, n))
    print(matrix)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 2018-09-23
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多