set()
s может содержать только уникальные элементы - кортежи могут быть хэшируемыми и могут быть помещены в set
.
Создать tuples
чисел из интервала и добавить их в set
доset
длина соответствует вашему количеству строк.Затем создайте список списков из 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]]
Подробнее о разбиении вы можете прочитать в Как разбить список на куски одинакового размера?