以随机顺序对数组排序

时间:2018-12-03 10:22:17

标签: javascript arrays algorithm sorting random

我试图了解如何以随机顺序对数组进行排序。因此,我找到了以下代码:

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

我的主要问题是为什么他们使用 0.5而不是其他数字? 和它如何真正起作用,请尝试使其变得简单,因为我是javascript的新手,并且正在为这些事情而苦苦挣扎

7 个答案:

答案 0 :(得分:9)

Math.random()返回0 and 1之间的数字(不包括)。我们使用0.5是因为它是平均值

Array.sort()根据返回值对参数进行排序。因此,0.5 - Math.random()将以相等的概率产生正值或负值。因此,它将对参数随机进行排序。

它如何真正起作用

  • 如果Array.sort的返回值为,则该索引的索引 第一个参数将比第二个参数更高
  • 如果为,则第二个参数的索引为 比第一个要高。
  • 而且,如果它是0,则不执行任何操作

答案 1 :(得分:8)

您曾经使用过

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

这里最重要的as.sort(func)func(a,b)将返回[-0.5,0.5]范围内的值。

因为此函数返回0.5 - Math.random(),而Math.random()将返回[0,1]范围内的浮点值。 这样您的func将返回[-0.5,0.5]范围内的值。

这意味着排序顺序将设置为increasedecrease。 这是随机的。 这样您的结果将是随机的

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return Math.random();
}  

console.log(s);

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0 - Math.random();
}  

console.log(s);

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

答案 2 :(得分:5)

Math.random()返回介于 0到1(包括0但不包括1)之间的随机值 。 所以0.5充当中点。如果使用大于1或小于0的使用值,它将始终为true或false。 因此,使用0.5。

您可以在此处阅读有关Math.random()的更多信息

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

  

让我们通过示例进一步了解

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 0.5 - Math.random();
}  

console.log(s);

这是使用大于1的值时得到的结果

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return 1 - Math.random();
}  

console.log(s);

使用小于0的值会发生这种情况

var as = ["max","jack","sam"];  
var s = as.sort(func);  

function func(a, b) {  
  return -1 - Math.random();
}  

console.log(s);

PS :-

  1. 尝试从上述所有条件打印输出,您将看到最后两个条件将始终从函数返回true或false。这样就不会进行随机排序。

  2. 现在谈论从0到0.99的任何值,您可以使用任何值,但是0.5可以最好地满足您的目的。因为这是一个中间点,您最有可能获得最佳答案。

答案 3 :(得分:1)

Math.random返回0到1之间的数字。

排序函数使用返回值x如下:

  • x == 0:相同的值,可以按“想要的方式”订购

  • x < 0:第一个对象小于第二个对象,因此它在排序数组中的索引将小于另一个对象的

  • x > 0x < 0相同,但反之亦然

由于Math.random返回0到1之间的数字,并且我们还希望获得负数,因此必须减去一些值。 在这里0.5 - Math.random()给出的数字介于0.5到-0.5

答案 4 :(得分:1)

如果您只是想随机地将元素移至其起始位置附近,请确保将sortrandom一起使用,但是在大多数情况下,这不是您想要的。您想彻底改组数组,完全随机化每个元素的位置。对于内置random函数中的sort来说,这是一个糟糕的做法,因为它偏向初始状态,这意味着“改组”数组中的元素将倾向于保持在其位置附近(靠近起点的人很有可能停留在起点附近,等等。)。数组的大小越大,被拖曳的次数就越少。

以下是证明:Is it correct to use JavaScript Array.sort() method for shuffling?

这是我大部分时间使用的数组改组函数。它彻底随机化每个元素的位置。

function shuffle(arr) { // randomly rearanges the items in an array
  const result = [];
  for (let i = arr.length-1; i >= 0; i--) {
    // picks an integer between 0 and i:
    const r = Math.floor(Math.random()*(i+1));   // NOTE: use a better RNG if cryptographic security is needed
    // inserts the arr[i] element in the r-th free space in the shuffled array:
    for(let j = 0, k = 0; j <= arr.length-1; j++) {
      if(result[j] === undefined) {
        if(k === r) {
          result[j] = arr[i];    // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed. 
          break;
        }
        k++;
      }
    }
  }
  return result;
}

答案 5 :(得分:0)

如果您使用函数参数调用sort方法,则会被多次调用。此函数应接受两个参数(让我们分别调用第一个A和第二个B):每次它应返回一个值:

  1. 小于零(如果A
  2. 如果A = B,则等于零
  3. 如果A> B,则零值更大

因此,在此示例中,我们需要均匀分布负值和正值的随机返回值。由于Math.random()返回0到1之间的值,因此0.5 - Math.random()将返回-0.5到0.5之间的值,符合要求。

答案 6 :(得分:0)

最短形式(使用 Lambda 表达式):

为了回答“如何以随机顺序对数组进行排序”的问题,正如其他人所提到的,Array.sort() 函数可以将函数作为参数。

语法

Array.sort([sort_by_function()])

内部 sort_by_function() 接受两个参数(例如:x & y)并且使用 Math.random() 返回 -0.5 到 0.5 之间的值,它返回:

  • 负数(-0.5 到 -0.1),如果 x < y
  • 零 (0),如果 x = y 正
  • 正数(0.1 到 0.5),如果 x > y

请记住,如果您不向外部 Array.sort() 函数传递任何内容,它只会按 升序 顺序重新排列/排序元素,但是,如果您传递一个函数 (作为参数),然后它的行为基于内部 sort_by_function() 返回的内容,因为它交换给定数组的每个元素(通过一次交换两个元素对),这种交换是根据什么决定的内部 sort_by_function() 返回。

为了实现随机排序,Array.sort() 函数将对每对元素进行如下重新排列/排序,对于 a:

  • 负值:按升序交换,
  • 零:没有变化,
  • 正值:按降序交换。

示例

arr.sort(function(x,y){return Math.random() - 0.5});

由于没有人提到使用短 Lambda 表达式,这里是一个示例,说明如何通过使用 Lambda 表达式来缩短内部参数函数,如下所示:

arr.sort(() => Math.random() - 0.5);