2009-05-02 126 views
8

我爲我的一位藝術家朋友創建了一個網站,她希望佈局保持不變,但她也希望將她製作的新作品混合到當前佈局中。所以我在主畫廊頁面上有12個縮略圖(thumb1 - thumb12),還有18個圖像(img1 - img18)以及隨機化數組中的元素?

我想到的方法是創建一個所有圖像的數組,然後隨機化它,然後只需刮掉第一個12並將它們裝入拇指插槽即可。另一種方法是從陣列中隨機選擇12張圖像。在第一種情況下,我無法找到隨機化數組元素的方法。在後一種情況下,除了使用第二個數組外,我無法圍繞如何保持圖像不止一次加載,這似乎非常低效和可怕。

順便說一句,我正在用JavaScript做所有這些事情。

+0

[如何隨機化一個javascript數組?](http://stackoverflow.com/questions/2450954/how- to-randomize-a-javascript-array) – Bergi 2013-06-01 13:43:37

回答

18

我寫了這個前一段時間,它恰好適合你在找什麼。我相信這是費雪耶茨洗牌是ojblass是指:

Array.prototype.shuffle = function() { 
    var i = this.length; 
    while (--i) { 
     var j = Math.floor(Math.random() * (i + 1)) 
     var temp = this[i]; 
     this[i] = this[j]; 
     this[j] = temp; 
    } 

    return this; // for convenience, in case we want a reference to the array 
}; 

請注意,修改Array.prototype可以被認爲是不好的形式。您可能希望將此作爲獨立方法來實現,該方法將數組作爲參數。總之,要完成它:

var randomSubset = originalArray.shuffle().slice(0,13); 

或者,如果你不想確實修改原始:

var randomSubset = originalArray.slice(0).shuffle().slice(0,13); 
+0

請注意,內部循環是Fisher-Yates shuffle提到的。外循環正在進行多次洗牌。 (並不是說這有什麼問題。) – 2009-05-02 01:48:20

+2

只需注意你的'iters'循環。據說Fisher-Yates shuffle是無偏的,這意味着每個排列都是相同的可能性。決不是混合陣列「意味着更好的組合」。 – 2009-05-02 01:53:26

1

你的第一種方法可行。只要洗牌的18個元素,並採取前12個。