代码之家  ›  专栏  ›  技术社区  ›  b. e. hollenbeck

随机化数组中的元素?

  •  8
  • b. e. hollenbeck  · 技术社区  · 15 年前

    我为我的一个艺术家朋友创建了一个网站,她希望布局保持不变,但她也希望将她制作的新绘画混合到当前布局中。所以我在主图库页面上有12个缩略图(拇指1-拇指12),还有18个图片(img1-img18)要放置

    我想到的方法是创建一个所有图像的数组,将其随机化,然后简单地刮掉前12个图像并将其加载到拇指槽中。另一种方法是从数组中随机选择12个图像。在第一种情况下,我找不到随机化数组元素的方法。在后一种情况下,除了使用第二个数组之外,我无法将我的大脑集中在如何避免图像加载超过一次,这看起来非常低效和可怕。

    顺便说一下,我用JavaScript完成了所有这些工作。

    4 回复  |  直到 9 年前
        1
  •  18
  •   Jeremy Huiskamp    15 年前

    我刚才写的,正好符合你的要求。我相信奥布拉斯指的是费希尔·耶茨的洗牌:

    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);
    
        2
  •  6
  •   Community Egal    7 年前

    你应该实现 Fisher-Yates shuffle (也被称为Knuth洗牌)。

    看看提供的好答案 here .

        3
  •  1
  •   Bill the Lizard Drew    15 年前

    你的第一种方法是可行的。只需洗牌18个元素,并采取前12个。

        4
  •  1
  •   StackOverflowed    12 年前

    最近我自己也遇到了这个问题。这里的帖子有助于: http://waseemsakka.com/2012/02/14/javascript-dropping-the-last-parts-of-an-array-and-randomizing-the-order-of-an-array/ .

    基本上,从随机化数组开始:

    thumbs.sort(function(a, b) {
         return Math.random() - 0.5;
    })
    

    这将随机化18个元素的顺序。然后,为了只保留前12个元素,您只需删除最后6个元素:

    thumbs.length = 12;