아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
향기로운파리253
향기로운파리25321.01.13

javascript 무작위로 섞기 질문

_.suffle = function (arr) { let arrCloned = arr.slice(); for (let fromIdx = 0; fromIdx < arr.length; fromIdx++) { const toIdx = Math.floor(Math.random() * arr.length); let temp = arrCloned[fromIdx]; arrCloned[fromIdx] = arrCloned[toIdx]; arrCloned[toIdx] = temp; // 이부분 } return arrCloned; };

arrCloned[toIdx] = temp 부분이 이해가 잘 안됩니다 바로 윗 코드인 arrCloned[fromIdx] = arrCloned[toIdx] 로 인해서

arrCloned[fromIdx]의 값은 랜덤생성된 난수인덱스에 해당하는 값으로 변경된 상태아닌가요?

그럼 arrCloned[toIdx] = temp 여기서 temp도 바뀌어 있어야 하는게 아닌가 궁금합니다.

숫자로 예를들면 [1,2,3,4,5] 라는 arr를 입력받고 arrCloned에 복사한 값을 할당

for문은 이제 시작했다고 치고 랜덤생성된 난수는 2라고 가정하겠습니다.

arrCloned[fromIdx] = arrCloned[toIdx] 코드를 통해 arrCloned[0]의 값을 arrCloned[2] 의 값으로 바꾼다

그렇게되면 [3,2,3,4,5] 가 된상태이고 바로아랫코드인 arrCloned[toIdx] = temp; 에서 temp는

arrCloned[fromIdx] 이니 arrCloned[0]과 같다 위 코드로 바뀐상태이니 arrCloned[0]은 3이다.

그럼 arrCloned[toIdx]에다가 3을 넣어준다 이렇게되면 뭔가 이상해지는데 제가 디버그 돌려보니까

제 생각과는 다르게 arrCloned[toIdx] = temp 이부분에서 처음 받았던 배열의 0번째 인덱스를 가져오더라구요.. 이유가 정말 궁금합니다..

55글자 더 채워주세요.
답변의 개수2개의 답변이 있어요!
  • 맞는거 같은데요.. 소스 뒤에 주석으로 값들을 적어 볼게요.

    fromIdx = 0; //for문 첫번째

    const toIdx = Math.floor(Math.random() * arr.length); //toIdx = 2 (랜덤생성된 난수는 2라고 가정)

    let temp = arrCloned[fromIdx]; //temp = arrCloned[0]=>temp=1

    arrCloned[fromIdx] = arrCloned[toIdx]; //arrCloned[0] = arrCloned[2]; => arrCloned[0] = 3;

    arrCloned[toIdx] = temp; // arrCloned[2] = 1;


  • 안녕하세요. 먼저 위의 shuffle() 코드는 정상입니다 ^^

    간단히 생각하시면 됩니다.

    temp 변수는 임시 저장 공간이라 생각하시면 돼요.

    [1,2,3,4,5] 배열을 기준으로 랜덤 난수가 2라고 하셨잖아요.

    arrCloned[fromIdx] = arrCloned[toIdx] 코드를 통해 arrCloned[0]의 값을 arrCloned[2] 의 값으로 바꾼다

    => 맞습니다. 정확히 arrCloned[0] = arrCloned[2] 배열은 [3,2,3,4,5]가 됩니다.

    그렇게되면 [3,2,3,4,5] 가 된상태이고 바로아랫코드인 arrCloned[toIdx] = temp; 에서

    temp는 arrCloned[fromIdx] 이니 arrCloned[0]과 같다

    => 여기에서!! temp 값은 1이겠죠? 왜냐하면 배열 [3,2,3,4,5] 로 바뀌기 전인 최초 [1,2,3,4,5] 배열에서 0번째 값인 1을 temp 에 넣었으니까요

    즉 for문의 1회 실행 결과값은 [3,2,0,4,5] 가 됩니다!!

    let temp = arrCloned[fromdx] ; 가 먼저 실행되고 temp 변수에 값이 저장되기 때문입니다.

    순서대로 생각하시면 됩니다!

    도움이 되셨길 바랍니다. 감사합니다.