2009-05-02 108 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个。