如何在JavaScript中多次洗牌数组

如何在JavaScript中多次洗牌数组,javascript,arrays,shuffle,Javascript,Arrays,Shuffle,我一直在阅读JavaScript中对数组执行洗牌的最佳方法,并且遇到了Fisher-Yates模型(in和in)。我尝试过使用文章中提到的两个示例函数,但是当我想多次洗牌数组并将不同的结果分配给两个不同的变量时,它们的结果完全相同 function shuffle(array) { var i = 0, j = 0, temp = null for (i = array.length - 1; i > 0; i -= 1) {

我一直在阅读JavaScript中对数组执行洗牌的最佳方法,并且遇到了Fisher-Yates模型(in和in)。我尝试过使用文章中提到的两个示例函数,但是当我想多次洗牌数组并将不同的结果分配给两个不同的变量时,它们的结果完全相同

    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);
在控制台中,播放并返回:

["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"]
["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"]
及电脑手报税表:

["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"]
["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"]

这可能非常简单,但我被难住了。我认为再次调用该函数将返回不同的结果。

您的函数将“原地”洗牌该数组,也就是说,它正在更改数组,而不是创建新数组

因为在第二次调用中它是同一个数组,所以您“丢失”了第一次洗牌结果

要解决此问题,请创建阵列的克隆:

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

这可能是因为您使用的是相同的种子,这意味着可重复的结果,看看这个问题,它可能会有所帮助:您正在对阵列进行适当的洗牌。所有变量都指向同一个数组对象,因此当您洗牌它时,它们都会看到更改。另见: