Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   использовать Math.random без повторения значений (https://javascript.ru/forum/css-html-firefox-mizilla/61557-ispolzovat-math-random-bez-povtoreniya-znachenijj.html)

ababagalamaga 23.02.2016 23:15

использовать Math.random без повторения значений
 
Добрый день, прошу подсказать решение..
Нужно перемешать массив из 16 дивов, но чтобы числа не повторялись. На форуме для данного случая решения не нашел.
Пытался использоваь shuffle - не получается.

function mix_picts()
{
for(i = 0; i<= picts.length - 1; i++)
{
var num = Math.floor(Math.random() * cnt_images) + 1;
picts[i].style.background = 'url(img/' + num + '.jpg)';
}

}

mix_picts()

Заранее спасибо.

Deff 23.02.2016 23:21

Оч Быстрый Код от Рони! (Плохо искали...

Array.prototype.shuffle = function(min,max) {
  min = min || 0;
  max = ++max || this.length;
  var len = max - min;
  max = len - this.length;
  this.length = len;
    for (var a = this.length-1; 0 <= a; a--) {
       if(a < max) {break}
        var b = Math.floor(Math.random() * a),
            c = void 0 === this[b] ? (b + min) : this[b];
            this[b] = void 0 === this[a] ? (a + min) : this[a];
            this[a] = c
    }
    this.reverse();
    this.length -= max;
    return this
};


var arr = Array(16).shuffle();
alert(arr);

ababagalamaga 23.02.2016 23:23

буду пробовать
Спасибо

Vlasenko Fedor 24.02.2016 12:19

function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;
  while (0 !== currentIndex) {
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}
alert(shuffle([1,2,3,4,5,6,7,8,9]));

описание метода
https://en.wikipedia.org/wiki/Fisher...3Yates_shuffle
Fisher–Yates Shuffle Visualization

рони 24.02.2016 12:33

Цитата:

Сообщение от Poznakomlus
0 !== currentIndex

зачем красное?

Vlasenko Fedor 24.02.2016 12:58

строгое сравнение быстрее отрабатывать должно


Часовой пояс GMT +3, время: 14:52.