функция перемешивания, которая не меняет исходный массив
Обновление : здесь я предлагаю относительно простой (не с точки зрения сложность ) и короткий алгоритм, который будет просто хорошо с небольшими массивами, но это определенно будет стоить намного больше, чем классический Durstenfeld алгоритм, когда вы имеете дело с огромными массивами. Вы можете найти Durstenfeld в одном из лучших ответов на этот вопрос.
Оригинальный ответ:
Если вы не хотите, чтобы ваша функция случайного воспроизведения изменяла исходный массив , вы можете скопировать ее в локальную переменную, а затем сделать все остальное с помощью простого перемешивания логика .
function shuffle(array) {
var result = [], source = array.concat([]);
while (source.length) {
let index = Math.floor(Math.random() * source.length);
result.push(source[index]);
source.splice(index, 1);
}
return result;
}
Логика перемешивания : выберите случайный индекс, затем добавьте соответствующий элемент в массив результатов и удалите его из копии исходного массива . Повторяйте это действие, пока исходный массив не получит пусто .
И если вы действительно хотите, чтобы это было коротко, вот как далеко я мог бы получить:
function shuffle(array) {
var result = [], source = array.concat([]);
while (source.length) {
let index = Math.floor(Math.random() * source.length);
result.push(source.splice(index, 1)[0]);
}
return result;
}