Сортировка массива в произвольном порядке

Я пытаюсь понять, как работает сортировка массива в случайном порядке. Итак, я нашел следующий код:

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

А это значит, что порядок сортировки будет установлен increase или decrease. это случайно. Таким образом, ваш результат будет случайным

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

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

console.log(s);

Ответ 2

Math.random() возвращает число от 0 до 1 (исключение). Мы используем 0.5, потому что это среднее значение.

Array.sort() сортирует параметры на основе возвращаемого значения. Таким образом, 0.5 - Math.random() даст либо положительное, либо отрицательное значение с равной вероятностью. Следовательно, он будет сортировать параметры случайным образом.

Как это действительно работает

  • Если возвращаемое значение Array.sort() является положительным, то индекс первый параметр будет выше, чем у второго.
  • Если он отрицателен, то индекс второго параметра будет выше, чем у первого.
  • И, если это 0, то ничего не делать.

Ответ 3

Math.random() возвращает случайное значение от 0 до 1 (0 включено, но 1 исключено). Таким образом, 0,5 действуют как средние. Если для использования используется значение больше 1 или меньше 0, оно всегда будет либо истинным, либо ложным. Поэтому по этой причине используется 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);

Ответ 4

Math.random возвращает число от 0 до 1.

Функция сортировки использует возвращаемое значение x следующим образом:

  • x == 0: то же значение, может заказать "как он хочет"

  • x < 0: первый объект меньше второго, поэтому его индекс в отсортированном массиве будет меньше, чем у другого

  • x > 0 же, как x < 0 но наоборот

Поскольку Math.random возвращает число от 0 до 1, и мы хотим также получить отрицательные числа, мы должны вычесть некоторое значение. Здесь 0.5 - Math.random() будет давать число от 0,5 до -0.5

Ответ 5

Поскольку вы просто хотите понять, что происходит при сортировке, проверьте этот код:

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

function func(a, b) {  
    var randomValue = Math.random();
    if (randomValue > 0.5) return -1;
    if (randomValue < 0.5) return 1;
    return 0;
}

Сначала начнем с a & b. a удерживает значение массива на этапе сортировки, которое необходимо сравнить с значением b. Так, например: a может быть "jack" & b может быть "max". Итак, чтобы отсортировать его в порядке возрастания или убывания, мы просто сравниваем a с b и возвращаем значение из: 1, -1 ИЛИ 0.

return 1; //a is greater than b.
return -1; //b is greater than a.
return 0; //a is equal to b.

Таким образом, в приведенном выше примере randomValue будет иметь десятичное значение от 0 до 1. Если это значение больше 0,5, тогда оно вернет -1, а если значение меньше 0,5, то оно вернется 1. Если оно равно 0,5 он вернет 0. Он просто равен:

0.5 - Math.random();

Проверьте эту функцию, чтобы сделать ее более понятной:

function compare(a, b) {
  if (a < b) {
    return -1;
  }
  if (a > b) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

Пожалуйста, ознакомьтесь с этим ресурсом, чтобы узнать больше: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Ответ 6

Если вы просто хотите подтолкнуть элементы к их начальным позициям случайным образом, используйте sort random, но в большинстве случаев это не то, что вам нужно. Вы хотите тщательно перемешать массив, полностью рандомизировать положение каждого элемента. И для этого random во встроенной функции sort это ужасная практика, потому что она смещена к начальному состоянию, что означает, что элементы в "перемешанном" массиве будут стремиться оставаться около своих позиций (те, которые были в начале, имеют высокая вероятность остаться в начале и т.д.). Чем больше размер массива, тем меньше он перемешивается.

Вот доказательство: правильно ли использовать метод JavaScript Array.sort() для перемешивания?

А вот функция для тасования массивов, которую я использую большую часть времени. Он тщательно рандомизирует положение каждого элемента.

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

Ответ 7

Если вы вызываете метод sort с параметром функции, вызывается несколько раз. Эта функция должна принимать два параметра (пусть вызовет первый A и второй B) Каждый раз, когда он должен вернуть значение:

  1. Меньше нуля, если A <B
  2. Равно нулю, если A = B
  3. Больше нуля, если A> B

Поэтому в этом примере нам нужны случайные значения возврата, которые равномерно распределяют отрицательные и положительные значения. Поскольку Math.random() возвращает значение от 0 до 1, 0.5 - Math.random() будет возвращать значения между -0.5 и 0.5, что соответствует требованиям.

Ответ 8

arr = ["baasdf", "oqiwuer", "laks", "oiyv"];
const randomizer = input => {
    output = [];
    input.forEach(item => output.splice(Math.random()*(output.length-0),0,item));
    return output;
};