Вы не указали, насколько велики ваши массивы или насколько вы обеспокоены эффективностью.Одним из возможных решений было бы просто сделать перемешивание по Кнуту, а затем проверить, удовлетворено ли ваше ограничение, и повторить перемешивание, если нет.
Если вы хотите немного большей эффективности, вы можете попробовать это вместо этого.Поскольку i
уменьшается, после шага exchange a[j] and a[i]
, a[i]
фиксируется.Так что просто измените алгоритм на:
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i; repeat until a[j] != i
exchange a[j] and a[i]