随机数组生成的意外行为

时间:2016-04-20 13:22:33

标签: javascript arrays sorting coercion

我试图按降序排序生成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();
}

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

  

new GenerateRandomArray()=&gt;   [924,804, 79 ,788,585,451,267,217,153,135]

     

new GenerateRandomArray()=&gt;   [869,697,647, 59 ,458, 30 ,291,157,112,111]

     

new GenerateRandomArray()=&gt;   [999, 98 ,872,823,705,418,404,306,259,20]

     

new GenerateRandomArray()=&gt;   [688,666,664,615,580,565,336,304,250,246]

     

new GenerateRandomArray()=&gt;   [912,906,759,690,673,481,429,355,19,103]

为什么某些数组的格式正确,而其他一些中间有一个非有序数字

我测试过:

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

这并没有改变奇怪的结果。

我是否遗漏了类似JS强制性财产的东西?

谢谢:)

3 个答案:

答案 0 :(得分:3)

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

要按数值排序,您可以提供自己的比较功能。

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

答案 1 :(得分:1)

使用

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之前,但由于数字被转换为字符串,因此“80”以Unicode顺序出现在“9”之前。

     

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

还有一件事:

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

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

答案 2 :(得分:1)

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;
}