Python 函数,该函数应使用定义为输入列表的行/列之和生成矩阵

Python 函数,该函数应使用定义为输入列表的行/列之和生成矩阵,python,matrix,random,Python,Matrix,Random,我有一个任务,使函数从范围(0-8)内的非负整数生成矩阵 该函数的输入有两个列表: sumForEveryCol sumForEveryRow 每个列表包含每个行/列的值的总和 示例:sumForEveryRow应按其索引包含每行的总和(sumForEveryRow[0]=第一行的总和…等等) sumForEveryColumn[0]=第一列的总和。。sumForEveryColumn[1]-第二列。。) 每行或每列之和为40的常数值 任何单元格的值都应在0到8之间 我有一些奇怪的想法(

我有一个任务,使函数从范围(0-8)内的非负整数生成矩阵

  • 该函数的输入有两个列表:
    • sumForEveryCol
    • sumForEveryRow
  • 每个列表包含每个行/列的值的总和
  • 示例:sumForEveryRow应按其索引包含每行的总和(sumForEveryRow[0]=第一行的总和…等等)
  • sumForEveryColumn[0]=第一列的总和。。sumForEveryColumn[1]-第二列。。)
  • 每行或每列之和为40的常数值
  • 任何单元格的值都应在0到8之间
我有一些奇怪的想法(代码如下),但根本没有机会工作。。因为算法。。。生成这种矩阵的一般算法是什么?用python实现它的最佳方法是什么

例如:

sumsForEveryRow = [4,20,8,8] = constant 40
sumsForEveryCol = [8,8,8,8,8] = constant 40

gen_matrix(sumForEveryRow, sumForEveryCol) should produce random matrix like:

[ 0 , 2 , 0 , 0 , 2 ],  - sum of row 1 should be 4
[ 1 , 2 , 8 , 5 , 4 ],  - sum of row 2 should be 20
[ 3 , 2 , 0 , 3 , 0 ],  - sum of row 3 should be 8
[ 4 , 2 , 0 , 0 , 2 ],  - sum of row 4 should be 8
sum for every column should be
  8   8   8   8   8



import random
import numpy

sumsForEveryCol = [8,8,8,8,8]
sumsForEveryRow = [4,20,8,8]
def gen_matrix(sumForEveryCol, sumForEveryRow):
    sum = 40
    max_value_cell = 8
    num_of_rows = len(sumsForEveryRow)
    num_of_cols = len(sumsForEveryCol)
    matrix = numpy.zeros((num_of_rows, num_of_cols), dtype=numpy.int)

    for i in range(0, num_of_rows - 1):
        cur_row_sum = sumsForEveryRow[i]
        for j in range(0, num_of_cols - 1):
            if max_value_cell >= cur_row_sum:
                if cur_row_sum == 0:
                    matrix[i][j] = 0
                else:
                    # Dont generate 0 values ????
                    rand_digit = random.randint(1, cur_row_sum)
                    cur_row_sum = cur_row_sum - rand_digit
                    matrix[i][j] = rand_digit
            else:
                rand_digit = random.randint(0, max_value_cell)
                matrix[i][j] = rand_digit
                cur_row_sum = cur_row_sum - rand_digit


    return matrix

你说的“随机”到底是什么意思?如果说“non-random”是一条红鲱鱼,那么每个non-random函数都只是随机函数()的一个特例,这很简单。如果“随机”的意思是分布在所有可能解的集合上应该是一致的,那么实现起来可能会有点复杂。指定您心目中的“随机性”类型。我根本不需要所有可能的解决方案。我需要一个满足任务条件的答案…如上所述:如果您需要一个答案,并且不关心解决方案,那么实现找到第一个解决方案的确定性算法。但是,您应该从
gen\u random\u matrix
的名称中删除“random”。否则,您必须指定“随机”是什么意思。“算法是什么”——为什么要用“the”这个词?有许多方法,例如回溯。我很懒,所以我个人的偏好是写一个快速进化算法(这让我想起了一些幻方,我在进化幻方方面取得了很好的成功)。这可以被认为是一种具有虚拟目标函数的算法。列可以被视为源,行可以被视为汇。目标列编号可以视为供给,行目标编号可以视为需求。位于
(i,j)
位置的数字
x
对应于从源
i
流向接收器
j
x
单元。可以将
x
上的限制视为边缘上的容量。单纯形算法可以解决这个问题,尽管可能有些过分。