Fisher-Yates随机播放Javascript

时间:2016-10-12 01:51:13

标签: javascript arrays shuffle splice

JS的新手,目前正在大学学习。对于我目前的JS项目,我正在建立一个记忆卡游戏。我开始考虑如何随意洗牌,我接近Fisher-Yates Shuffle算法所做的事情 - this page上的第二个程序。但是,我完全不明白拼接方法后[0]的作用。这是变换/压缩阵列的原因吗?如果是的话,我找不到其他的例子/文件。

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

2 个答案:

答案 0 :(得分:2)

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

更熟悉的索引操作用法:

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

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

答案 1 :(得分:0)

array.splice()返回一个数组,但是当你洗牌时你想从一个未知位置取一张随机卡并把它放在新数组中(洗牌)。现在抓住的是你不想通过执行copy.push(array.splice(i, 1)再次添加类似的数组,因为这会将整个返回的数组添加到复制数组,并且shuffle的随机性将减少,这反过来将导致依赖导致你的游戏,因为数组将相似(〜)到最后一个只翻转几位。将[0]添加到array.splice(i, 1)可确保您只复制时间返回的整个结果数组中的一个元素,从而产生更大的随机性。