Рандомизация элементов в массиве? - PullRequest
8 голосов
/ 02 мая 2009

Я создал сайт для своего друга-художника, и она хочет, чтобы макет оставался прежним, но она также хочет, чтобы новые картины, которые она произвела, были добавлены в текущий макет. Итак, у меня есть 12 миниатюр (thumb1 - thumb12) на главной странице галереи и 18 изображений (img1 - img18) для размещения

Подход, о котором я думал, состоял в том, чтобы создать массив всех изображений, рандомизировать его, затем просто соскоблить первые 12 и загрузить их в слоты большого пальца. Другой подход заключается в случайном выборе 12 изображений из массива. В первом случае я не могу найти способ рандомизировать элементы массива. В последнем случае я не могу сосредоточиться на том, как предотвратить загрузку изображений более одного раза, кроме использования второго массива, который кажется очень неэффективным и пугающим.

Кстати, я делаю все это в Javascript.

Ответы [ 4 ]

18 голосов
/ 02 мая 2009

Я написал это некоторое время назад, и так получилось, что вы ищете. Я полагаю, что это случайный случай Фишера-Йейтса, к которому относится 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);
6 голосов
/ 02 мая 2009

Вы должны реализовать случай Фишера-Йейтса (также известный как случайный случай Кнута).

Посмотрите на отличный ответ здесь .

1 голос
/ 28 февраля 2012

Я недавно столкнулся с этой проблемой сам. Пост здесь помог: 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;
1 голос
/ 02 мая 2009

Ваш первый подход будет работать. Просто перемешайте 18 элементов и возьмите первые 12.

...