随机创建一个矩阵,在列和行中没有重复的元素

时间:2018-08-05 15:37:00

标签: python algorithm

我需要创建一个大小为(N x N)的方阵,其中元素将在(0到N-1)的范围内,并且行和列中将没有重复的元素。如果可能的话,还要以某种随机的方式做到这一点。我想出了一个算法,其中每行和每列都有一个列表,其中包含尚未使用的值。因此,它的作用是遍历行和列,并为每个元素找到一组可能的值并从中随机选择,同时从可能值的列表中删除选定的元素。

n = 5
unused_numbers_column = list(list(range(n)) for j in range(n))
unused_numbers_row = deepcopy(unused_numbers_column)
data_list = []
for i in range(n):
    new_row = []
    for j in range(n):
        intersection_list = [k for k in unused_numbers_row[i] if k in unused_numbers_column[j]]
        print(intersection_list)
        new_val = intersection_list[np.random.randint(0,len(intersection_list))]
        print(new_val)
        unused_numbers_row[i].remove(new_val)
        unused_numbers_column[j].remove(new_val)
        new_row.append(new_val)
    data_list.append(new_row)
    print("full array = " + str(data_list))
data = np.array(data_list)
print(data)

但是,这种算法很少成功,而大多数失败。谁能想到另一个解决方案?

2 个答案:

答案 0 :(得分:0)

这是新的解决方案,因为我最初误解了您的问题。它的作用是生成[0,N-1]范围内的随机数字序列,然后随机排列每一行以避免行和列中重复的元素:

import random

def createMatrix(n):
    firstRow = random.sample(range(n),n)
    permutes = random.sample(range(n),n)
    return list(firstRow[i:]+firstRow[:i] for i in permutes)


N = 5
m = createMatrix(N)
for i in m:
    print(i)

输出:

[0, 2, 1, 4, 3]
[3, 0, 2, 1, 4]
[1, 4, 3, 0, 2]
[2, 1, 4, 3, 0]
[4, 3, 0, 2, 1]

答案 1 :(得分:-1)

尝试这样的事情:

import random

def matrix(n):
    matrix = []
    for x in range(n):
        choices = [i for i in range(n)]
        row = []
        for y in range(n):
            row.append(random.choice(choices))
            choices.remove(row[-1])
        matrix.append(row)
    return matrix

经过修改以满足要求:值0到N-1,其中每行没有重复的元素