자바스크립트 배열 무작위로 섞기 (shuffle)

원본: 자바스크립트로 배열 섞기

자바스크립트로 배열을 섞는 방법에는 Fisher-Yates 알고리즘, sort() 메소드, Lodash 함수 등이 있습니다.

이러한 배열을 섞는 작업은 무작위 데이터를 만드는 알고리즘 등에 필요한 일반적인 작업입니다.

다양한 방법을 활용해 프로젝트에 가장 적합한 방법을 적용할 수 있습니다.

이 포스트에서는 네 가지 배열 섞기 알고리즘에 대해 알아보겠습니다.

Fisher-Yates 알고리즘으로 배열 섞기

Knuth shuffle 이라고도 알려진 Fisher-Yates 알고리즘은 배열을 무작위 순서로 섞는 데 널리 사용되는 방법입니다.

이는 마지막 요소부터 첫 번째 요소까지 배열을 반복하여 각 요소를 섞이지 않은 나머지 부분에서 무작위로 선택된 요소로 바꾸는 방식입니다.

개발자 도구를 열고 다음의 코드를 테스트 해보겠습니다:

function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));

    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

const myArray = [1, 2, 3, 4, 5];
const shuffledArray = shuffleArray(myArray);

console.log(shuffledArray);
Fisher-Yates 배열 섞기

이번 예제에서는 for 루프를 사용하여 배열의 끝에서 부터 처음까지 루프를 돌며 섞이지 않은 부분을 랜덤으로 바꿔가며 전체 배열을 무작위로 섞었습니다.

console.log() 메소드를 사용하여 shuffleArray의 값을 출력해보면 배열이 섞인 것을 확인할 수 있습니다.

이는 구현이 조금 길고 가독성이 떨어지지만 널리 쓰이는 방법입니다.

sort() 메소드로 배열 섞기

배열을 섞는 또 다른 방법은 사용자 정의 비교 함수와 sort() 메소드를 사용하는 것입니다.

각 요소에 대해 난수를 생성하고 0.5를 빼면 무작위 순서를 가진 배열을 얻을 수 있습니다.

function shuffleArray(array) {
  return array.sort(() => Math.random() - 0.5);
}

const myArray = [1, 2, 3, 4, 5];
const shuffledArray = shuffleArray(myArray);

console.log(shuffledArray);
sort() 메소드로 배열 섞기

위의 예제에서는 간단히 sort() 메소드를 사용하여 요소의 값을 비교하는 콜백 함수에 Math.random() 메소드로 요소를 무작위로 섞었습니다.

이는 빌트인 메소드를 활용해 간단히 배열을 섞는 방법입니다.

Lodash 라이브러리로 배열 섞기

직접적인 구현보다 라이브러리 사용을 선호하는 경우 Lodash를 선택할 수 있습니다.

이는 배열 요소를 편리하게 무작위로 섞는 shuffle() 함수를 제공합니다.

이 방법을 사용하려면 프로젝트에 Lodash 라이브러리를 포함해야 합니다.

const _ = require('lodash');

const myArray = [1, 2, 3, 4, 5];
const shuffledArray = _.shuffle(myArray);

console.log(shuffledArray);

라이브러리를 사용하면 다양한 기능을 사용하여 매우 간편하게 목적을 이룰 수 있습니다.

하지만 외부 라이브러리이기 때문에 애플리케이션이 무거워 질 수 있습니다.

시나리오나 프로젝트 상황에 따라 올바른 사용법을 익히고 적절히 필요한 곳에 사용하는 것 역시 중요합니다.

정리

자바스크립트에서 배열을 섞는 작업은 일반적인 작업이며 이를 달성하는 방법에는 여러 가지가 있습니다.

Fisher-Yates 알고리즘, 사용자 정의 비교 함수를 사용한 sort() 메소드 등은 널리 사용되는 접근 방식입니다. 또한 Lodash와 같은 라이브러리는 배열을 섞는 편리한 방법을 제공합니다.

시나리오나 솔루션에 가장 적합한 방법을 선택하고 이를 구현하는 것이 중요합니다.

다량의 배열을 섞을 때는 코드를 철저하게 테스트하고 성능에 미치는 영향을 고려해야 합니다. 그래야 비로소 프로젝트에 자신있게 랜덤성을 추가할 수 있습니다.

관련 글

자바스크립트 튜토리얼