javascript - 如何在 JavaScript 中多次打乱数组

标签 javascript arrays shuffle

<分区>

我一直在阅读关于在 JavaScript 中对数组执行洗牌的最佳方法,并且遇到了 Fisher-Yates 模型(在 this articlethis article 中)。我已经尝试使用文章中指向的两个示例函数,但是当我想多次打乱数组并将不同的结果分配给两个不同的变量时,它们最终会完全相同。

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

在控制台 playerHand 返回:

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

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

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

最佳答案

您的函数“就地”随机播放数组 - 也就是说,它正在更改数组而不是创建新数组。

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

要解决这个问题,创建数组的克隆:

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

关于javascript - 如何在 JavaScript 中多次打乱数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52280421/

相关文章:

javascript - 如何启用/禁用单选按钮交互上的文本字段?

c - 返回动态分配的二维数组的问题

java - 随机采样 arraylist 的子集,无需替换

按组多次重新排列列并将结果放入新列中

c# - 使用 Random 和 OrderBy 是一个好的洗牌算法吗?

javascript - 重新打开 JAM 对话框

javascript - 为什么 Angular 加载我的根模板两次

javascript - 检查是否有具有特定 id 的 div

java - 为什么从基元创建数组会复制它们?

arrays - append 一个数组并存储在 UserDefaults 中(Swift)