Javascript randomise le tableau sans avoir d'élément en position de départ

J'ai un problème de Javascript. J'ai un utilisateur saisissez une liste de noms, que je place ensuite dans un tableau. Long histoire courte, je programme une façon aléatoire pour les gens de savoir à qui ils vont acheter des cadeaux de Noël. Par exemple, le tableau d'origine comprend les noms suivants:

Alex Joel Lindsay Cori 

Je souhaite ensuite aléatoirement les noms afin que j'obtienne une liste aléatoire, comme suit:

 Lindsay Cori Joel Alex 

J'aimerais ensuite afficher les noms du premier tableau et les aligner avec le nom aléatoire dans le même emplacement. Par exemple, dans cet exemple, Alex est associé à Lindsay, Joel est associé à Cori, Lindsay est associé à Joel, et Cori est associé à Alex. J'utilise actuellement la méthode de randomisation suivante:

 function shuffle(array){ var m = array.length, t, i; while(m){ i = Math.floor(Math.random() * m--); t = array[m]; array[m] = array[i]; array[i] = t; } return array; }; 

Le problème avec cette fonction est que le tableau ne se situe pas dans un nouvel emplacement. Par exemple, avec cette méthode, je peux avoir le tableau initial suivant:

 Alex Joel Lindsay Cori 

Et mon tableau, avec la fonction ci-dessus pour le randomiser, entraînera quelque chose comme ceci:

 Cori Alex Lindsay Joel 

Cela signifie que Alex est associé à Cori, Joel est associé à Alex, Lindsay est associé à Lindsay et Cori est assuré par Joel. Là est le problème. Si c'est un programme pour voir qui achète un cadeau de Noël pour qui, Lindsay ne peut PAS acheter un cadeau pour Lindsay.

Quelle serait une fonction de randomisation de tableau appropriée pour résoudre ce problème?

Merci pour votre aide!!

Essayez --m , pas m-- :

 function shuffle(array){ var m = array.length, t, i; while(m){ i = Math.floor(Math.random() * --m); t = array[m]; array[m] = array[i]; array[i] = t; } return array; }; 

Parce que si vous utilisez m-- vous pouvez obtenir i == m et échanger l'élément de tableau avec lui-même.

D'abord, j'ai construit un tableau d'index, puis l'ai mélangé et vérifié le dernier collé.

Je pense que c'est ce que vous voulez: (j'ai ajouté un chèque à la fin, n'oubliez pas de le supprimer)

 <script> var start = [ 'Alex', 'Joel', 'Lindsay', 'Cori' ] function shuffle(array) { // Support var support = []; for(var i = 0; i < array.length; i++) { support[i] = i; } // Support Build for(var i = 0; i < support.length; i++) { var random = Math.floor(Math.random() * (support.length - i)) + i; if(i == (support.length - 2) && support[i + 1] == (i + 1)) { var ex = support[i]; support[i] = support[i + 1]; support[i + 1] = ex; break; } if(random == support[i]) { i--; continue; } var ex = support[i]; support[i] = support[random]; support[random] = ex; } // Result var result = []; for(var i = 0; i < support.length; i++) { result[i] = array[support[i]]; } return result; }; for(var i = 0; i < 1000; i++) { if(start == shuffle(start)) alert('fail.'); } </script>