2016-03-17 103 views
0

這是一個沮喪和骯髒的香草javascript問題。我使用的是經典陣列隨機播放功能:隨機數組函數產生相同的結果

function shuffle(array) { 
    var currentIndex = array.length, temporaryValue, randomIndex; 

    while (0 !== currentIndex) { 

     randomIndex = Math.floor(Math.random() * currentIndex); 
     currentIndex -= 1; 

     temporaryValue = array[currentIndex]; 
     array[currentIndex] = array[randomIndex]; 
     array[randomIndex] = temporaryValue; 
    } 

    return array; 
    } 

,然後反覆調用它的另一個功能:

function generateQuartile (array) { 

    var shuffle1 = shuffle(array); 

    var shuffle2 = shuffle(array); 

    var shuffle3 = shuffle(array); 

    //all three shuffles are the same 

    } 

的問題是,所有這三個變量都得到相同的結果。該陣列洗牌一次,然後不再。我似乎無法確定這是什麼。我猜這是某種範圍/提升問題,但我真的無法弄清楚。謝謝你的幫助!

回答

2

洗牌工作正常。問題是你每次都返回相同的數組。在每次調用中,您都需要使用隨機元素創建一個新數組。最簡單的事情將是克隆陣列就在函數的開始:

array = array.slice(); 

隨着這種變化,shuffle1shuffle2shuffle3將有三個不同的陣列。另外,原始數組不會被修改;這可能是好的或壞的事情,取決於你的設計。

或者,你可以獨自離開你的shuffle功能和克隆每個返回值:

var shuffle1 = shuffle(array).slice(); 
// etc. 
+0

是完全的工作 - 但我還是不明白我是如何返回相同的陣列... while循環每次調用都會運行,隨機發生,爲什麼數組不會更新:/ –

+1

@LukeSchunk - 它正在更新數組的_elements_,但數組本身仍然是同一個對象,所以當您每次更改它時調用,所有引用看到相同的對象更改.. –

+0

,因爲數組是JavaScript中的引用?所以它不會改變任何東西? –