Рандомизация элементов в массиве?
-
03-07-2019 - |
Вопрос
Я создал сайт для своего друга-художника, и она хочет, чтобы макет остался прежним, но она также хочет, чтобы новые картины, которые она произвела, были добавлены в текущий макет. Итак, у меня есть 12 миниатюр (thumb1 - thumb12) на главной странице галереи и 18 изображений (img1 - img18) для размещения
Подход, о котором я думал, состоял в том, чтобы создать массив всех изображений, рандомизировать его, затем просто соскоблить первые 12 и загрузить их в слоты для большого пальца. Другой подход заключается в случайном выборе 12 изображений из массива. В первом случае я не могу найти способ рандомизировать элементы массива. В последнем случае я не могу сосредоточиться на том, как предотвратить загрузку изображений более одного раза, кроме использования второго массива, который кажется очень неэффективным и пугающим.
Кстати, я делаю все это в Javascript.
Решение
Я написал это некоторое время назад, и так получилось, что вы ищете. Я считаю, что это случай Фишера-Йейтса, на который ссылается 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);
Другие советы
Вы должны реализовать перемешивание Фишера-Йейтса (также известное как перемешивание Кнута). ). р>
Ваш первый подход сработает. Просто перемешайте 18 элементов и возьмите первые 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;