【问题标题】:Unexpected behavior with random array generation [duplicate]随机数组生成的意外行为[重复]
【发布时间】:2016-08-13 05:11:00
【问题描述】:

我试图按降序生成 10 到 1000 之间的随机数数组。

这是我写的代码:

function GenerateRandomArray(){
  var array = [];

  for (var i = 0; i < 10; i++) {
    array[i] = Math.round(Math.random() * (1000 - 10 + 1) + 10);
  }
  return array.sort().reverse();
}

在终端中运行时,我得到的结果如下:

新的 GenerateRandomArray() => [924、804、79、788、585、451、267、217、153、135]

新的 GenerateRandomArray() => [869、697、647、59、458、30、291、157、112、111]

新的 GenerateRandomArray() => [ 999, 98, 872, 823, 705, 418, 404, 306, 259, 20 ]

新的 GenerateRandomArray() => [688、666、664、615、580、565、336、304、250、246]

新的 GenerateRandomArray() => [912、906、759、690、673、481、429、355、19、103]

为什么有些数组格式正确,而有些数组中间有一个无序数

我测试过:

  • 将数字转换为字符串
  • 访问数组中的无序元素(它给出相同的数字 - 显然)
  • 使用函数而不是构造函数来实现

这不会改变奇怪的结果。

我是否缺少诸如 JS 强制属性之类的东西?

谢谢:)

【问题讨论】:

  • .sort() 将传递的参数视为字符串,数组排序为值将是字符串而不是数字 - 根据 JS 规范
  • 感谢现在可以使用 :)

标签: javascript arrays sorting coercion


【解决方案1】:

默认情况下,sort 函数按字母数字/字母顺序排序(即“字符串排序”)。在字符串中,“aaa”出现在“b”之前,同样“111”出现在“2”之前。

要改为按数值排序,您可以提供自己的比较函数。

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

【讨论】:

    【解决方案2】:
    function GenerateRandomArray(){
      var arr = [];
    
      for (var i = 0; i < 10; i++) {
        arr.push(Math.round(Math.random() * 1000));
      }
      arr.sort(function compareNumbers(a, b) {
        return a - b;
      });
      return arr;
    }
    

    【讨论】:

    • 你应该试着解释你的代码是做什么的,这样读者可以更好地理解它
    【解决方案3】:

    使用

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

    或者简单地说:

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

    文档:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

    引用:

    默认排序顺序是根据字符串 Unicode 码位。

    如果未提供 compareFunction,则通过将元素转换为字符串并按 Unicode 代码点顺序比较字符串来对元素进行排序。例如,“香蕉”出现在“樱桃”之前。在数字排序中,9 在 80 之前,但由于数字被转换为字符串,因此在 Unicode 顺序中,“80”在“9”之前。

    要比较数字而不是字符串,比较函数可以简单地从 a 中减去 b。

    还有一件事:

    这是一个返回随机数数组(已排序)的函数,因此它不应该与new 关键字一起使用,因为您没有将它用作构造函数。另外,个人喜好,我可能将函数命名为getRandomNumberArraygetArrayOfRandomNumbers

    示例:https://jsfiddle.net/cmfoo49m/2/

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 2016-05-05
      • 2014-01-11
      • 2011-12-28
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多