Скажем, у меня есть список допустимых X = [1, 2, 3, 4, 5]
и список допустимых Y = [1, 2, 3, 4, 5]
.
Мне нужно сгенерировать все комбинации каждого элемента в X
и каждый элемент из Y
(в данном случае, 25) и получить эти комбинации в случайном порядке.
Это само по себе было бы простым, но есть дополнительное требование: в этом случайном порядке не может быть повторения одного и того же X
подряд. Например, это нормально:
[1, 3]
[2, 5]
[1, 2]
...
[1, 4]
Это не:
[1, 3]
[1, 2] <== the "1" cannot repeat, because there was already one before
[2, 5]
...
[1, 4]
Теперь наименее эффективной идеей было бы просто рандомизировать полный набор, если повторений больше нет. Мой подход был несколько иным, неоднократно создавая перетасованный вариант X
и список всех Y * X
, а затем выбирал из него случайный следующий. До сих пор я придумал это:
import random
output = []
num_x = 5
num_y = 5
all_ys = list(xrange(1, num_y + 1)) * num_x
while True:
# end if no more are available
if len(output) == num_x * num_y:
break
xs = list(xrange(1, num_x + 1))
while len(xs):
next_x = random.choice(xs)
next_y = random.choice(all_ys)
if [next_x, next_y] not in output:
xs.remove(next_x)
all_ys.remove(next_y)
output.append([next_x, next_y])
print(sorted(output))
Но я уверен, что это можно сделать еще более эффективно или более лаконично?
Кроме того, мое решение сначала проходит через все значения X
, прежде чем продолжить полный набор, что не является совершенно случайным. Я могу жить с этим для моего конкретного случая приложения.