随机数组生成时出现意外行为

Unexpected behavior with random array generation

本文关键字:意外 数组 随机      更新时间:2023-09-26

我试图生成一个按降序排列的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 Generate RandomArray()=>[924404,79,788585451267217153135]

new Generate RandomArray()=>[869697647,59,458,30、291、157、112、111]

new Generate RandomArray()=>[999,98,872,823,705,418,404,306,259,20]

new Generate RandomArray()=>[688666664615580565336304250246]

new Generate RandomArray()=>[920906759696673481429355 19103]

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

我测试过:

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

这并不能改变奇怪的结果。

我是不是错过了JS强制属性之类的东西?

感谢:)

默认情况下,sort函数按字母数字/字母顺序进行排序(即"字符串排序")。就字符串而言,"aaa"在"b"之前,类似地,"111"在"2"之前。

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

array.sort(function(a, b) { 
    return a - b;
});
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;
}

使用

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〃;在";9〃;按Unicode顺序。

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

还有一件事:

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

样品:https://jsfiddle.net/cmfoo49m/2/