2012-07-09 3 views
0

이 루프를 이해할 수없는 것 같습니다.이 JavaScript 임의 번호 생성기는 어떻게 작동합니까?

for (i = 1; i < 50; i++) { 
    rand = Math.ceil(Math.random() * 49); 
    temp = nums[i]; 
    nums[i] = nums[rand]; 
    nums[rand] = temp; 
} 

큰 코드의 일부입니다. nums[i]은 각각의 색인 번호로 채워진 1-49의 배열이며,이 for 루프를 통해 실행되고 난수로 채워집니다.

왜 임시 변수가 만들어 지는지, nums[rand]=temp; 코드 줄이 어떻게 작동하는지, 어떻게 수행되는지, 그리고 var 키워드없이 초기화되지 않은 이유는 무엇입니까?

누군가이 루프가 어떻게 작동하는지 설명 할 수 있습니까?

+2

솔루션과 상관없이 [naive random sort] (http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html)이며 실제로는 무작위가 아닙니다. 당신이 생각하기에 그렇습니다. – Gareth

+0

var vs no var -> http://stackoverflow.com/questions/1470488/difference-between-using-var-and-not-using-var-in-javascript – ManseUK

답변

1

코드가 시도하려고하는 것은 배열을 임의로 이동하는 것입니다. 배열을 통해 이동하고 각 위치에 대해 임시 변수에 값을 저장하고 배열의 다른 위치를 선택한 다음 값을 다른 위치로 스왑합니다.
변수의 값을 바꾸는 가장 간단한 방법이기 때문에 임시 변수가 필요합니다.

1

nums 배열에서 두 값을 무작위로 교체하는 것입니다. 첫 번째 것을 무시하더라도; 자바 스크립트 배열은 0에서 시작하지만 루프는 1에서만 시작하므로 두 번째 배열 요소에서만 시작됩니다.

nums = [a, b, c]; // just mocking some data 

rand = 0..2; // lets say it = 2 
temp = nums[1]; // = 'b', the 2nd array element 
nums[1] = temp; // so nums[1] goes from 'b' to 'c' 
nums[temp] = temp; // and nums[2] goes from 'c' to 'b' 

전체가 아주 나쁜 코드입니다 :

그래서 코드를 통해 그것이 같은 무언가를 루프의 둘레에 간다 때마다 스테핑. 배열과 함께 작동하는 경우에는 루프의 상한선을 50으로 하드 코딩하는 대신 array.length를 사용해야합니다.

+0

에 대해 읽어보십시오.하지만 왜 이전 값을 임의의 숫자를 생성 할 때 당신은 방금 주문한 숫자를 던져 버리고 난수로 채 웁니다. 왜 임시 값을 이전 값으로 저장해야합니까? – dotmax

+0

그것은 모두 nums [] 배열에 무엇이 있는지에 따라 다릅니다. 50 개의 난수로 가득 찼습니까? 이 코드는 배열 값을 서로 바꾸기 때문에 – duncan