У меня есть вектор (n = 4 в примере):
x = '0123';
Мне нужен вектор y того же размера, что и x, и с теми же элементами, что и в x, в другом порядке:
y = ['0123'; '0132'; '0213'; '0231'; '0312'; '0321'; '1023'; '1032'; '1203'; '1302'; '2013'; '2031'; '2103'; '2301'];
y(ceil(rand * numel(y(:, 1))), :)
то есть такая перестановка, что каждому элементу в y разрешено случайным образом изменять не более чем k позиций по отношению к его исходной позиции в x (k = 2 в примере). Распределение вероятностей должно быть однородным (т. е. каждая перестановка должна произойти с одинаковой вероятностью).
Очевидный, но неэффективный способ сделать это, конечно, найти случайную неограниченную перестановку и проверить постфактум, происходит ли это с соблюдением ограничения. Для небольших векторов вы можете найти все перестановки, удалить те, которые не разрешены, и случайным образом выбрать среди оставшихся. Любая идея о том, как сделать то же самое более эффективно, например, заменив элементы местами?