JavaScript 배열에서 임의의 값을 선택하려면 Math.random() 메서드를 활용하면 됩니다. 이 글에서는 Fisher-Yates 셔플 알고리즘을 응용해 배열 전체를 무작위로 섞은 뒤, 원하는 개수만큼 임의의 값을 추출하는 방법을 예제와 함께 살펴봅니다.
예제 코드
var subjectNames = ["Javascript", "MySQL", "Java", "MongoDB", "Python", "Spring Framework"];
for(var index = subjectNames.length - 1; index > 0; index--){
var rndIndex = Math.floor(Math.random() * (index + 1));
var subjNameTemp = subjectNames[rndIndex];
subjectNames[rndIndex] = subjectNames[index];
subjectNames[index] = subjNameTemp;
}
var getRandomSubjectName = subjectNames.slice(0, 3);
console.log(getRandomSubjectName);
코드 동작 원리
핵심 로직을 단계별로 살펴보면 다음과 같습니다.
- Math.random(): 0 이상 1 미만의 난수를 반환합니다.
- Math.floor(Math.random() * (index + 1)): 0부터 현재 인덱스(index) 사이의 정수 중 하나를 무작위로 선택합니다.
- 요소 교환(swap): 선택된 인덱스의 요소와 마지막 위치의 요소를 서로 바꿔가며 배열 전체를 무작위로 섞습니다. 이 방식이 바로 널리 알려진 Fisher-Yates 셔플입니다.
- slice(0, 3): 섞인 배열에서 앞쪽 3개의 요소를 잘라내어 임의의 값들을 얻습니다.
이 방식은 모든 요소가 동일한 확률로 선택되므로 편향 없는 공정한 랜덤 추출이 가능하다는 장점이 있습니다.
프로그램 실행 방법
위 프로그램을 실행하려면 Node.js 환경에서 다음 명령어를 사용합니다.
node fileName.js
여기서는 파일 이름이 demo178.js라고 가정하겠습니다.
출력 결과
실행하면 아래와 같은 결과가 출력됩니다. 난수를 사용하기 때문에 실행할 때마다 선택되는 값은 달라집니다.
PS C:\Users\Amit\javascript-code> node demo178.js
[ 'Javascript', 'MySQL', 'Python' ]