2012-07-09 110 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

無論解決方案如何,這是[naïverandom sort](http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html),實際上並不是隨機的如你所想。 – Gareth 2012-07-09 09:30:39

+0

閱讀關於var vs no var - > http://stackoverflow.com/questions/1470488/difference-between-using-var-and-not-using-var-in-javascript – ManseUK 2012-07-09 09:31:38

回答

1

代碼試圖做的是洗牌數組。 它通過遍歷數組來工作,並且對於每個位置,將值存儲在臨時變量中,在數組中選擇另一個位置並將值與另一個位置交換。
臨時變量是必需的,因爲這是交換變量值最簡單的方法。

1

它只是隨機交換nums數組中的兩個值。儘管忽略了第一個; javascript數組從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' 

總體來說是相當糟糕的代碼。如果它正在處理一個數組,它應該使用array.length而不是hardcoding 50作爲循環的上限。

+0

但爲什麼你需要存儲生成隨機數字時的舊值不能將剛纔輸入的數字填入隨機數字爲什麼需要將舊值存儲在臨時數據中? – dotmax 2012-07-09 09:55:02

+0

這一切都取決於nums []數組中的內容。它只有50個隨機數嗎?因爲所有這些代碼都是交換數組值 – duncan 2012-07-09 10:57:18