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() 함수는 주어진 숫자보다 크지 않은 가장 큰 정수를 반환

 

이때 핵심은 배열의 각 요소가 자기 자신의 위치를 포함한 임의의 위치로 이동할 수 있다는 것입니다.

만약 자기 자신과의 교환을 허용하지 않으면 셔플의 결과가 일부 편향될 수 있습니다. 자기 자신의 위치에 올 수 없다는 것도 하나의 불필요한 제약이 될 수 있기 때문입니다.