Как перемешать элементы массива в JavaScript случайным образом?

Перемешивание массива в JavaScript

Привет! Я работаю с массивом и хочу, чтобы его элементы были перемешаны в случайном порядке.
Вот пример моего массива:

let myNumbers = [1, 2, 3, 4, 5, 6];

Как я могу сделать так, чтобы результат выглядел примерно так:

// Пример результата после перемешивания
[3, 1, 6, 2, 5, 4]

Мне интересно, какие варианты реализации такой функции существуют. Очень хотелось бы, чтобы каждый запуск возвращал разный порядок элементов. Буду признателен за любые советы и примеры кода!

я делаю через простую функцию - создаю новый массив и заполняю случайными элементами из исходного:

function mixArray(arr) {
  let result = [];
  let temp = [...arr];
  while (temp.length > 0) {
    let randomIndex = Math.floor(Math.random() * temp.length);
    result.push(temp.splice(randomIndex, 1)[0]);
  }
  return result;
}

Работает отлично, каждый раз новый порядок. Может чуть медленнее fisher-yates, но зато сразу понятно что происходит.

А ты тестировал на больших массивах? У меня были тысячи элементов - разница между алгоритмами была огромная. Fisher-Yates намного быстрее, особенно с большими данными. Какого размера твои массивы обычно?

Fisher-Yates - лучший вариант. Быстрый и по-настоящему случайный, в отличие от sort с Math.random который дает смещенные результаты.

function shuffle(array) {
  for (let i = array.length - 1; i > 0; i--) {
    let j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

Этот алгоритм везде используют, даже в lodash.

Если не хочешь менять исходный массив, скопируй его перед перемешиванием:

let shuffled = [...myNumbers].sort(() => Math.random() - 0.5);

Да, Fisher-Yates математически точнее, но для простых задач этого хватит. Главное — не забудь про spread оператор, иначе исходный массив изменится.

Ты уже пробовал какие-то варианты? Есть несколько способов сделать это, и мне любопытно, какой подход будет для тебя наиболее оптимальным. Для простоты можно использовать sort с Math.random, хотя это не самый лучший подход. Какой уровень сложности тебе нужен?