J’ai un tableau comme ceci :
Comment puis-je rendre aléatoire / shuffle il ?
J’ai un tableau comme ceci :
Comment puis-je rendre aléatoire / shuffle il ?
Le gouvernement de facto impartiale shuffle est l'algorithme de Fisher-Yates (aka Knuth) Shuffle.
Voir https://github.com/coolaj86/knuth-shuffle
Vous pouvez voir un grand visualisation ici (et le post original lié à cet)
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex ;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
Utilisé comme
var arr = [2, 11, 37, 42];
shuffle(arr);
console.log(arr);
Quelques infos à propos de l'algorithme utilisé.
Voici un JavaScript de mise en œuvre de l' shuffle de Fisher-Yates:
/**
* Randomize array element order in-place.
* Using Fisher-Yates shuffle algorithm.
*/
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
Le Fisher-Yates algorithme fonctionne par la sélection d'un élément aléatoire pour l'original de chaque élément du tableau, et puis l'exclure du tirage suivant. Tout comme choisissant au hasard à partir d'un jeu de cartes.
Cette exclusion est fait de façon intelligente par le remplacement de l'élément choisi avec l'élément en cours, puis en sélectionnant le prochain élément aléatoire du reste. Pour une efficacité optimale, la boucle s'exécute en arrière de sorte que le random pick est simplifié (il peut toujours commencer à 0), et il saute le dernier élément, car il n'y a pas d'autres choix plus.
Le temps d'exécution de cet algorithme est O(n). Notez que, bien qu'il ne retour au tableau pour des raisons de commodité, la lecture aléatoire est effectuée sur place. Donc, si vous ne voulez pas modifier le tableau d'origine, en faire une copie d'abord avec .slice(0)
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.