我需要创建一个大小为(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)
但是,这种算法很少成功,而大多数失败。谁能想到另一个解决方案?
答案 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,其中每行没有重复的元素