Fisher–Yates 在 Javascript 中随机播放

Fisher–Yates Shuffle in Javascript

刚接触 JS,目前正在大学学习。对于我当前的 JS 项目,我正在构建一个存储卡游戏。我开始思考如何随机洗牌,我接近了 Fisher–Yates Shuffle 算法的作用——this page 上的第二个程序。但是,我不明白 [0] 在 splice 方法之后到底做了什么。难道是什么shifts/compacts数组?如果是的话,我找不到其他的 examples/documentations 了。

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 个元素,并将其作为单值数组 return 保存(就像 array.splice(i, 2)将第 i 个和第 i+1 个元素和 return 它们剪掉为一个二元数组)。然后 [0],简单的索引操作,从该数组中选择单个元素(因为我们不需要数组);然后使用 copy.push.

将此单个元素添加到 copy

更熟悉的索引操作用法:

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

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

array.splice() returns 一个数组,但是在洗牌时您想从未知位置随机拿一张牌并将其放入新数组(洗牌后的一张)中。现在要注意的是,您不想通过 copy.push(array.splice(i, 1) 再次添加类似的数组,因为这会将整个返回的数组添加到复制数组中,并且随机播放的随机性会降低,这反过来会导致依赖结果你的游戏,因为数组将与最后一个相似(~),只是翻转了几位。将 [0] 添加到 array.splice(i, 1) 可确保您仅从一次返回的整个结果数组中复制一个元素,从而产生更大的随机性。