2012-03-07 4 views
1

Habituellement une permutation aléatoire pour un tableau avec des éléments n signifie une distribution uniforme de n! possibilités, et le shuffle Knuth est utilisé pour le faire:permutation aléatoire avec [i] = i

for i from n − 1 downto 1 do 
    j ← random integer with 0 ≤ j ≤ i 
    exchange a[j] and a[i] 

Mais avec la contrainte que a[i] != i, je n'ai aucune idée comment former une telle permutation uniformément.

Par exemple, avec n = 3, comment former une permutation aléatoirement à partir des possibilités ci-dessous?

{1, 2, 0}, {2, 0, 1}

Répondre

2

Permutation sans point fixe est appelé derangement

Comme le nombre de derangemets est O (n!), tout comme le nombre de permutations, générer toutes les permutations et en filtrant ceux qui ne sont pas les dérangements ne nuiraient pas à votre performance.

La recherche rapide m'a renvoyé these slides, qui décrit un autre algorithme.

+1

Merci, j'ai trouvé le document officiel de cet algorithme [ici] (http://www.siam.org/proceedings/analco/2008/anl08_022martinezc.pdf). – peter

0

Vous n'avez pas précisé la taille de vos baies ni votre degré d'efficacité. Une solution possible serait simplement de faire le shuffle de Knuth, puis de tester si votre contrainte est satisfaite et de refaire le shuffle sinon.

Si vous voulez un peu plus d'efficacité, vous pouvez essayer à la place. Parce que i est décroissante, après l'étape exchange a[j] and a[i], a[i] est fixée. Donc, modifier simplement l'algorithme:

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] 
+0

La complexité n'a pas d'importance, mais je dois prouver qu'elle est uniformément répartie. Un résultat simple satisfaisant la contrainte n'est pas suffisant. – peter

+0

Sur la compréhension que votre fonction aléatoire est, alors c'est. Le shuffle original de Knuth était uniformément réparti sur toutes les permanentes - en particulier il a la même chance de produire chaque permutation contrainte. Il suffit de jeter le résultat s'il ne correspond pas à la contrainte et essayer à nouveau ne changera pas cela. – Chowlett

+0

Jetez un oeil à ceci: http://stackoverflow.com/questions/7279895/shuffle-list-ensuring-that-no-item-remains-in-same-position, il semble que cet algorithme a été testé pour ne pas être uniforme. – peter

Questions connexes