У меня попытался задать этот вопрос до, но он никогда не мог правильно это сформулировать. Надеюсь, на этот раз я прав:
У меня есть список уникальных элементов. Я хочу перетасовать этот список, чтобы создать новый список. Тем не менее, я хотел бы ограничить тасование, так что каждое новое положение элемента не более d
от его исходного положения в списке.
Итак, например:
L = [1,2,3,4]
d = 2
answer = magicFunction(L, d)
Теперь одним возможным результатом может быть:
>>> print(answer)
[3,1,2,4]
Обратите внимание, что 3
переместило два индекса, 1
и 2
переместили один индекс, а 4
не переместился вообще. Таким образом, это действительное перетасовка, согласно моему предыдущему определению. Для подтверждения этого можно использовать следующий фрагмент кода:
old = {e:i for i,e in enumerate(L)}
new = {e:i for i,e in enumerate(answer)}
valid = all(abs(i-new[e])<=d for e,i in old.items())
Теперь я легко мог бы сгенерировать все возможные перестановки L
, фильтр для действительных и выбрать один случайным образом. Но это не кажется очень изящным. Есть ли у кого-нибудь другие идеи о том, как это сделать?