为什么使用 Math.random() 的 sort() 与使用数字不同?

Why sort() using Math.random() is different from using a number?

我使用相同的数字范围得到两个不同的结果。对不起,如果它很明显,我是一个初学者,找不到这个问题的答案。

下面的代码打乱了数组。

(function(array) {
    array.sort(() => 0.5 - Math.random());
    console.log(array);
})([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
// Output: [Shuffled array]

但是,如果我手动写入一个介于-0.5 和0.5 之间的随机数,我无法随机播放它。为什么??

(function(array) {
    array.sort(() => 0.2145467);
    console.log(array);
})([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
// Output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

回调函数的 return 值可以是以下三种之一:

  • 小于0(表示一个小于另一个)
  • 0(表示值相同)
  • 大于 0(意味着它们是相反的)

如果您 return 一个固定数字,那么排序顺序将保持不变。

如果你 return 一个 0.5 - 一个介于 0 和 1 之间的随机数,那么它将是三个中的任意一个。

sort回调从数组中获取两个项(你完全忽略)并且应该return一个<0的数字,== 0 或 > 0 以指示两项中哪一项更大或它们是否相等。 回调被调用多次, 算法需要比较的每个随机项目对调用一次。如果您 return 一个实际的随机数,那么每对项目每次都会根据自定义数字确定为 greater/equal/less。如果您硬编码一个数字,那么所有项目的结果都是相同的。

参见:

(function(array) {
    array.sort((a, b) => {
      const r = 0.5 - Math.random();
      console.log(a, b, r);
      return r;
    });
    console.log(array);
})([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

在第一个代码段中,内联函数 () => 0.5 - Math.random() 被求值 多次 ,每次产生不同的值(有时 < 0,有时 > 0,或者也许even === 0), 导致随机排序。

在第二个代码段中,内联函数 () => 0.2145467 计算 多次 ,但是每次它产生相同的值(总是 > 0),导致固定的排序顺序。