javascript - Javascript 中的 Fisher-Yates Shuffle

标签 javascript arrays shuffle splice

JS 新手,目前正在大学学习。对于我当前的 JS 项目,我正在构建一个内存卡游戏。我开始思考如何随机洗牌,并且我接近了 Fisher-Yates Shuffle 算法的作用 - this page 上的第二个程序。但是,我不明白 [0] 在 splice 方法之后到底做了什么。它是移动/压缩阵列的原因吗?如果是,我找不到其他相关示例/文档。

function shuffle(array) {
  var copy = [], n = array.length, i;

  // While there remain elements to shuffle…
  while (n) {

    // Pick a remaining element…
    i = Math.floor(Math.random() * n--);

    // And move it to the new array.
    copy.push(array.splice(i, 1)[0]);
  }

  return copy;
}

最佳答案

array.splice(i, 1) 删除 array 的第 i 元素并将其作为单值数组返回(就像 array.splice(i, 2) 会剪掉第 i 个元素和第 i+1 个元素并将它们作为二元素数组)。然后,简单的索引操作 [0] 从该数组中选取单个元素(因为我们不需要数组);然后使用 copy.push 将这个单个元素添加到 copy 中。

更熟悉的索引操作用法:

array = [4, 7, 2, 10];
array[0]
// => 4
array[1]
// => 7

array = [18];
array[0]
// => 18

关于javascript - Javascript 中的 Fisher-Yates Shuffle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989317/

相关文章:

javascript - ES6 文件上的谷歌地图回调

java - JS如何同时插入和更新多行?

计算数组中的最小元素

arrays - 二维数组 - 检测位置是否在封闭模式内

c++ - 如何在不重叠数字的情况下生成 1 - 39 的随机数?

随机重新排序(洗牌)矩阵的行?

javascript - GoogleAuth.signIn().then() 未触发

javascript - Node.js:删除整行的正则表达式

ios - 使用谓词 iOS SDK 从字典数组中过滤数据

c++ - 验证 Knuth 洗牌算法是否尽可能公正