Сортировка массива в произвольном порядке
Я пытаюсь понять, как работает сортировка массива в случайном порядке. Итак, я нашел следующий код:
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) Каждый раз, когда он должен вернуть значение:
- Меньше нуля, если A <B
- Равно нулю, если A = B
- Больше нуля, если 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;
};