费希尔–;耶茨用Javascript洗牌

费希尔–;耶茨用Javascript洗牌,javascript,arrays,shuffle,splice,Javascript,Arrays,Shuffle,Splice,JS新手,目前在大学学习。对于我当前的JS项目,我正在构建一个存储卡游戏。我开始思考如何随机洗牌,我接近了Fisher–Yates洗牌算法的功能–第二个程序。但是,我不明白[0]在splice方法之后到底做了什么。是什么移动/压缩了阵列?如果是,我找不到其他关于这方面的例子/文档 function shuffle(array) { var copy = [], n = array.length, i; // While there remain elements to shuffle…

JS新手,目前在大学学习。对于我当前的JS项目,我正在构建一个存储卡游戏。我开始思考如何随机洗牌,我接近了Fisher–Yates洗牌算法的功能–第二个程序。但是,我不明白[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
-th元素并将其作为单值数组返回(就像
array.splice(i,2)
将剪切
i
-th和
i+1
-th元素并将其作为双元素数组返回)。然后,简单的索引操作
[0]
,从该数组中选取单个元素(因为我们不需要数组);然后使用
copy.push将此单个元素添加到
copy

索引操作的更常见用法:

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

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

索引操作的更常见用法:

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

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

array.splice()
返回一个数组,但在洗牌时,您希望从未知位置随机取出一张卡,并将其放入新数组(洗牌的一张)。现在的问题是,您不想通过执行
copy.push(array.splice(i,1)
再次添加类似的数组,因为这将把整个返回的数组添加到copy数组中,并且洗牌的随机性将降低,这反过来将导致游戏中的依赖结果,因为数组将类似(~)将
[0]
添加到
数组中。splice(i,1)
确保您只从一次返回的整个结果数组中复制一个元素,这会导致更大的随机性。

数组。splice()
返回一个数组,但在洗牌时,您希望从未知位置随机取出一张卡,并将其放入新数组(洗牌的一张)。现在的问题是,您不希望通过执行
复制.推送(数组.拼接(i,1))再次添加类似的数组
因为这会将整个返回的数组添加到复制数组中,而洗牌的随机性会降低,这反过来会导致游戏中的依赖结果,因为数组与最后一个数组相似(~),只翻转了几位。将
[0]
添加到
数组中。拼接(i,1)
确保您只从一次返回的整个结果数组中复制一个元素,这将导致更大的随机性。

谢谢@Cyclotron3x3,现在是有意义的。非常感谢。我没有得到的是随机性是由随机数
I
产生的,它将选择数组的随机索引进行拼接,然后结果将被推送到新数组的末尾
copy
,因此最终新数组元素的整个索引将是随机的(每次迭代都会推送到数组末尾的元素)。因此
[0]
这里多余?谢谢@Cyclotron3x3,现在有意义了。非常感谢。我不明白的是,随机性是由随机数
I
产生的,它将拾取阵列的随机索引进行拼接,然后结果将推送到新阵列的末尾
复制
,因此最终el的整个索引化新数组的元素将是随机的(每次迭代都会将元素推到数组的末尾)。所以这里的
[0]
不是多余的吗?谢谢@Amadan!所以我考虑了很多。我不明白的是,对我来说,
[0]
是多余的,因为拼接的范围是
(i,1)
splice
返回一个数组。
push
需要一个值。一个元素数组与其元素不同。这就像试图在搅拌机中放入一个装有西红柿的网袋,争论“好吧,我需要一个西红柿来制作这种酱汁,而袋子里只剩下一个西红柿,为什么不呢?”.你得先把西红柿从袋子里拿出来,因为那些塑料网纤维有点耐嚼.我现在拿到了.非常感谢@Amadan@Amadan尽管听起来很简单而且可能很愚蠢,但这个比喻——混合了一个西红柿——必须是对单个元素数组和元素本身之间差异的最好解释t我从没听说过。太棒了,谢谢你。:-)谢谢你@Amadan!所以我想了很多。我不明白的是,对我来说,
[0]
是多余的,因为我们只需要从阵列中去掉一个元素,因为拼接的范围是
(I,1)
splice
返回一个数组。
push
需要一个值。一个元素数组与其元素不是一回事。这就像试图在搅拌机中放入一个装有西红柿的网袋,争论说“好吧,我需要一个西红柿来制作这种酱汁,而袋子里只剩下一个西红柿,为什么不呢?”.你得先把西红柿从袋子里拿出来,因为那些塑料网纤维有点耐嚼.我现在拿到了.非常感谢@Amadan@Amadan尽管听起来很简单而且可能很愚蠢,但这个比喻——混合了一个西红柿——必须是对单个元素数组和元素本身之间差异的最好解释我从没听说过。太棒了,谢谢你。:-)