洗牌数组:为什么这样做有效?

Shuffling an array: Why does this work?

我正在制作 JavaScript 单人纸牌游戏。我正在寻找有关如何同时使用 sort()Math.random() 来洗牌的信息,这时我偶然发现了 CSS 技巧:

array.sort(function() {return 0.5 - Math.random()})

做工精美,棒极了,但我不知道为什么。有人能解释一下为什么这样吗?

Array.sort 的工作原理

在排序函数中,数组元素根据比较函数的return值排序。如果 a 和 b 是被比较的两个元素,则:

array.sort(function(a, b){return a - b});

现在,如果 (a-b) 小于 0,则将 a 排序到低于 b 的索引,因为 a 小于 b。

如果 (a-b) returns 0,保持 a 和 b 彼此不变,因为它们是相等的。 注意:ECMAscript 标准不保证这种行为。

如果 (a-b) 大于 0,则 b 排序到低于 a 的索引,因为 a 大于 b。

Math.Random 的工作原理

它只是 return 一个介于 0 和 1 之间的随机值。

现在来看这种情况,因为这里忽略了数组中的实际值,并且将随机值传递给 (a-b),函数将随机 return < 0、0 或 > 0被比较的每一对。因此,同一数组的排序顺序不同。