1547 votes

Comment rendre aléatoire (shuffle) un JavaScript array ?

J’ai un tableau comme ceci :

Comment puis-je rendre aléatoire / shuffle il ?

1870voto

ChristopheD Points 38217

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é.

932voto

Laurens Holst Points 6779

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).

175voto

deadrunk Points 3902
[1,2,3,4,5,6].sort(function() {
  return .5 - Math.random();
});

73voto

con Points 769

On peut (ou doit) utiliser comme un prototype de tableau :

De ChristopheD :

68voto

vn_grv Points 181

Utiliser la bibliothèque underscore.js. La méthode `` est agréable pour ce cas. Voici un exemple avec la méthode :

Prograide.com

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.

Powered by:

X