2 votes

Comment mélanger plusieurs fois un tableau en JavaScript ?

Je me suis renseigné sur la meilleure façon d'effectuer un mélange de tableaux en JavaScript et j'ai découvert le modèle de Fisher-Yates (dans la section cet article et en cet article ). J'ai essayé d'utiliser les deux fonctions d'exemple indiquées dans les articles, mais lorsque je veux mélanger le tableau plus d'une fois et affecter des résultats différents à deux variables différentes, ils finissent par être exactement les mêmes.

    function shuffle(array) {
    var i = 0,
        j = 0,
        temp = null

    for (i = array.length - 1; i > 0; i -= 1) {
        j = Math.floor(Math.random() * (i + 1))
        temp = array[i]
        array[i] = array[j]
        array[j] = temp
    }
    return array;
}

var deck = ["bat", "black-cat", "blood", "bone", "brain", "broom", "candle", "candy", "castle", "cauldrom", "coffin", "costume", "death", "devil", "fish-bone", "full-moon", "ghost", "grave", "grave-yard", "half-moon", "horror", "lantern", "magic", "monster", "owl", "pumpkin", "skull", "spider", "spider-web", "tree", "tree-2", "witch", "witch-hat", "zombie-1", "zombie-2"];

var playerHand = shuffle(deck);
var computerHand = shuffle(deck);

console.log(playerHand);
console.log(computerHand);

Dans la console, playerHand retourne :

["castle", "costume", "coffin", "candy", "blood", "death", "horror", "skull", "spider", "broom", "owl", "tree", "spider-web", "pumpkin", "grave", "devil", "brain", "ghost", "witch-hat", "magic", "bat", "black-cat", "full-moon", "tree-2", "cauldrom", "bone", "grave-yard", "half-moon", "zombie-1", "lantern", "monster", "zombie-2", "candle", "fish-bone", "witch"]

Et computerHand revient :

["castle", "costume", "coffin", "candy", "blood", "death", "horror", "skull", "spider", "broom", "owl", "tree", "spider-web", "pumpkin", "grave", "devil", "brain", "ghost", "witch-hat", "magic", "bat", "black-cat", "full-moon", "tree-2", "cauldrom", "bone", "grave-yard", "half-moon", "zombie-1", "lantern", "monster", "zombie-2", "candle", "fish-bone", "witch"]

C'est probablement très simple, mais j'ai du mal à comprendre. Je pensais que le fait de rappeler la fonction renverrait un résultat différent.

2voto

Amit Points 1

Votre fonction mélange le tableau "in-place", c'est-à-dire qu'elle modifie le tableau et n'en crée pas un nouveau.

Puisque c'est le même tableau dans le deuxième appel, vous "perdez" le résultat du premier shuffle.

Pour résoudre ce problème, créez un clone du tableau :

var playerHand = shuffle(deck.slice());
var computerHand = shuffle(deck.slice());

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