Deep Dive
셔플링 알고리즘
MoonJay
2023. 7. 2. 19:47
What
배열 순서 무작위로 섞기
Why
문제가 같은 순서로 출제되는 것을 막기 위하여
How
피셔-에이츠 셔플 알고리즘을 활용
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
var timeLimit = 7; // 제한 시간
var timeLeft = timeLimit; // 남은 시간
1. 배열의 마지막 인덱스부터 시작하여 각 요소 i에 대해 0부터 i까지의 무작위 정수 j를 생성합니다.
2. i번째 요소와 j번째 요소를 교환합니다.
3. 마지막으로, 무작위로 섞인 배열을 반환합니다.
- Math.random()은 0이상 1미만의 부동소수점 숫자를 반환
- Math.floor() 함수는 주어진 숫자보다 크지 않은 가장 큰 정수를 반환
이때 핵심은 배열의 각 요소가 자기 자신의 위치를 포함한 임의의 위치로 이동할 수 있다는 것입니다.
만약 자기 자신과의 교환을 허용하지 않으면 셔플의 결과가 일부 편향될 수 있습니다. 자기 자신의 위치에 올 수 없다는 것도 하나의 불필요한 제약이 될 수 있기 때문입니다.