it-swarm.com.ru

Сортировка массива в случайном порядке

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

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 и борюсь с этими вещами

12
Med Amine Elwere

Ты использовал

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

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

7
Jin

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

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

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

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

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

Это то, что вы получаете, когда используете значение больше 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);

P.S: - 

  1. Попробуйте распечатать выходные данные из всех вышеупомянутых условий, вы увидите, что последние два условия всегда будут возвращать либо true, либо false из функции. так что вы не получите случайную сортировку.

  2. Теперь поговорим о любом значении от 0 до 0,99, вы можете использовать любое значение, но 0,5 лучше всего подойдет для вашей цели. Поскольку это средняя точка, вы, скорее всего, получите лучший ответ. 

5
Code Maniac

Если вы просто хотите подтолкнуть элементы к их начальным позициям случайным образом, обязательно используйте 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;
}
1
Kresimir

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

1
Vivick

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

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

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

0
yunzen