Python 具有唯一性约束的矩阵随机化算法

Python 具有唯一性约束的矩阵随机化算法,python,algorithm,Python,Algorithm,我正在尝试开发一种算法,将一个NxN矩阵随机化N次,并具有以下约束:任意两个值A和B最多可以在结果矩阵的所有列中存在一次。例如,一个3x3矩阵随机化3次,结果如下: matrix #0 [0, 3, 6] [1, 4, 7] [2, 5, 8] matrix #1 [0, 3, 6] [7, 1, 4] [5, 8, 2] matrix #2 [0, 3, 6] [4, 7, 1] [8, 2, 5] 任意给定列中任意两个数字A和B的配对,例如矩阵#0的第0列中的0和1,对于每个结果矩阵中

我正在尝试开发一种算法,将一个NxN矩阵随机化N次,并具有以下约束:任意两个值A和B最多可以在结果矩阵的所有列中存在一次。例如,一个3x3矩阵随机化3次,结果如下:

matrix #0
[0, 3, 6]
[1, 4, 7]
[2, 5, 8]

matrix #1
[0, 3, 6]
[7, 1, 4]
[5, 8, 2]

matrix #2
[0, 3, 6]
[4, 7, 1]
[8, 2, 5]
任意给定列中任意两个数字A和B的配对,例如矩阵#0的第0列中的0和1,对于每个结果矩阵中的所有列都是唯一的。对于矩阵中的每两个成对值,此条件必须保持

我用以下代码开发了我认为是一个解决方案:

#!/usr/bin/python

w,h = 5,5
matrix_list = []

def rotate(l,n):
    return l[-n:] + l[:-n]

def transpose(l):
    return list(map(list, zip(*l)))

matrix = [[x*w + y for x in range(w)] for y in range(h)]
#matrix = transpose(matrix)

for i in range(w):
    matrix_list.append(matrix[:])
    matrix = [rotate(matrix[n],n) for n in range(w)]

for m in matrix_list:
    for arr in m:
        print(arr)
    print('\n')
它只需将每行的值移位N个位置,N是矩阵的行索引值

然而,我发现当N为偶数且N>2时,该算法不起作用,如4x4矩阵的以下部分输出所示(第0行和第2行中的值配对重复):


我试过各种变换和转置的方法,结果还是空的。如果您能帮助创建偶数维矩阵的解决方案,或是包含奇数和偶数矩阵的一般解决方案,我们将不胜感激。

为什么不用
random.shuffle()
?因为random.shuffle()不保证所需的约束。在什么意义上,您的预期解决方案是一个解决方案?您指定了随机性,但您的算法是确定性的。无论如何,也许你可以研究一下实验设计理论。你确定这是可能的吗?你能用暴力解决4x4的问题吗?约翰,你说得对。它是确定性的。然而,它确实达到了预期的结果。因此,也许我对问题的描述不准确。
(from matrix #0)
[0, 4, 8, 12]
[1, 5, 9, 13]
[2, 6, 10, 14]
[3, 7, 11, 15]

(from matrix #2)
[0, 4, 8, 12]
[9, 13, 1, 5]
[2, 6, 10, 14]
[11, 15, 3, 7]