javascript 무작위로 섞기 질문
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번째 인덱스를 가져오더라구요.. 이유가 정말 궁금합니다..
맞는거 같은데요.. 소스 뒤에 주석으로 값들을 적어 볼게요.
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 변수에 값이 저장되기 때문입니다.
순서대로 생각하시면 됩니다!
도움이 되셨길 바랍니다. 감사합니다.