set()s 只能保存唯一元素 - 元组是可散列的,可以放入 set。
从一个区间创建 tuples 的数字并将它们添加到 set 中,直到 set-length 与您的行数匹配。然后从set 创建一个列表列表:
import random
interval = range(100) # plenty more numbers then neeeded to fill 5*3 w/o repeats
matrix = (5,3)
ranges= set()
while len(ranges) < matrix[0]:
ranges.add(tuple(random.sample(interval, k=matrix[1])))
matrix = [ list(t) for t in ranges ]
print(matrix)
确保您有足够大的间隔,否则您将一遍又一遍地获得相同的元组,而您的 while 将永远无法完成。
输出:
[[23, 16, 93], [50, 60, 38], [86, 12, 3], [35, 28, 89], [77, 47, 36]]
如果您想在您的范围内使用 所有 个数字,则更容易将它们打乱并对其进行分区:
import random
matrix = (5,3) # dimension of matrix
m = matrix[0]*matrix[1] # total numbers needed
interval = random.sample(range(m), k=m) # create a shuffled list of the complete range
# partition the list into correctly sized intervals
k = [ interval[i*matrix[1]:(i+1)*matrix[1]] for i in range(matrix[0])]
print(k) # [[12, 3, 4], [2, 11, 8], [10, 5, 14], [1, 0, 6], [13, 9, 7]]
关于分区,您可以在How do you split a list into evenly sized chunks?阅读更多内容