Фишер-Йейтс Шафл в Javascript
Новичок в JS и в настоящее время учусь в колледже. Для моего текущего проекта JS я создаю карточную игру. Я начал думать о том, как случайным образом перемешать карты, и я приблизился к тому, что делает алгоритм Фишера-Йейтса Шафла - вторая программа на этой странице. Однако я не понимаю, что именно [0] делает после метода сплайсинга. Это то, что сдвигает / сжимает массив? Если да, я не могу найти другие примеры / документы об этом.
function shuffle(array) {
var copy = [], n = array.length, i;
// While there remain elements to shuffle…
while (n) {
// Pick a remaining element…
i = Math.floor(Math.random() * n--);
// And move it to the new array.
copy.push(array.splice(i, 1)[0]);
}
return copy;
}
2 ответа
array.splice(i, 1)
вырезает i
элемент array
и возвращает его как массив с одним значением (так же, как array.splice(i, 2)
будет вырезать i
и i+1
-ый элемент и вернуть их как массив из двух элементов). затем [0]
простая операция индексации выбирает этот единственный элемент из этого массива (так как нам не нужен массив); этот единственный элемент затем добавляется copy
с помощью copy.push
,
Более знакомое использование операции индексации:
array = [4, 7, 2, 10];
array[0]
// => 4
array[1]
// => 7
array = [18];
array[0]
// => 18
array.splice()
возвращает массив, но при перемешивании вы хотите взять случайную карту из неизвестной позиции и поместить ее в новый массив (перемешанный). Теперь вы поймете, что вы не хотите снова добавлять подобный массив, выполнив copy.push(array.splice(i, 1)
так как это добавит весь возвращаемый массив для копирования массива, и случайность вашего перемешивания будет уменьшена, что, в свою очередь, приведет к зависимому результату в вашей игре, потому что массив будет похож (~) на последний с несколькими перевернутыми битами. Добавление [0]
в array.splice(i, 1)
гарантирует, что вы копируете только один элемент из всего массива результатов, возвращенного за раз, что приводит к большей случайности.