【问题标题】:Why sort() using Math.random() is different from using a number?为什么 sort() 使用 Math.random() 与使用数字不同?
【发布时间】:2021-02-25 17:02:25
【问题描述】:

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

下面的这会打乱数组。

(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]

【问题讨论】:

  • 我很困惑。来自 15k+ 社区成员的三个答案以及新人的 3 个反对票和零个 cmets。看起来社区是两极分化的。

标签: javascript arrays sorting random shuffle


【解决方案1】:

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

见:

(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])

【讨论】:

    【解决方案2】:

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

    • 小于 0(表示一个小于另一个)
    • 0(表示值相同)
    • 大于 0(表示相反)

    如果您返回一个固定数字,那么排序顺序将是不变的。

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

    【讨论】:

    • @Christian — Math.random() 每次调用时都会生成一个不同的随机数,因此您不能将其替换为“随机数” " 因为有 很多 个随机的。
    • 我知道了。现在一切都说得通了!谢谢,昆汀。对不起,如果这个问题看起来很愚蠢,我还在学习。
    【解决方案3】:

    在第一个 sn-p 中,内联函数 () => 0.5 - Math.random() 被评估多次,每次产生不同的值(有时 0,甚至可能 === 0 ),从而产生随机排序顺序。

    在第二个 sn-p 中,内联函数 () => 0.2145467被评估 多次,但是每次它产生相同的值(总是 > 0),产生固定的排序顺序。

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2019-01-04
      • 2013-04-01
      相关资源
      最近更新 更多