Fisher-Yates 알고리즘
Fisher-Yates 알고리즘은 배열을 무작위로 섞는 간단하고 강력한 방법임.
알고리즘 원리
- 뒤에서부터 시작 - 배열의 마지막 요소부터 진행함.
- 랜덤 인덱스 선택 및 교환 - 현재 인덱스와 0부터 현재 인덱스 사이의 랜덤한 인덱스 선택, 두 값을 교환함.
- 순차 진행 - 앞쪽으로 이동하며 반복함.
코드 구현
function fisherYates(arr) {
for (let i = arr.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}
return arr;
}
예시
카드 5장 [A, B, C, D, E]가 있을 때 :
- 카드 ‘E’와 0~4 사이 랜덤 카드 교환
- 카드 ‘D’와 0~3 사이 랜덤 카드 교환
- 반복 후 순서가 완전히 랜덤해짐
결론
Fisher-Yates 알고리즘은 간단하면서 모든 경우가 동일 확률로 나오도록 보장함.
빠르고 효율적임.