2013-11-29 3 views
1

У меня есть двенадцать квадратов, и шесть из них выбраны случайным образом и затем применяется стиль. Это достигается путем генерирования случайных значений из массива уникальных значений. Проблема состоит в том, что генерируемые случайные значения не являются уникальными, например, 5 могут быть выбраны более одного раза. Я смотрел на так много сообщений здесь и там, кажется, было несколько разных способов достижения этого - перетасовка и т. Д. Что было бы наиболее эффективным?Уникальные случайные значения из массива уникальных значений javascript

for (var i = 0; i < 6 ; i++) 
    (function (i) { 
     setTimeout(function() { 
     var rand = arr[Math.floor(Math.random() * arr.length)]; 
     var square = document.getElementById('square' + rand); 
     square.style.background = black; 
    if (i == 6) Reset(); 
    }, 1500 * i); 
    })(i); 
    }; 
+0

Вы говорите, что нашли решения, так что вы пробовали? Я не вижу никаких попыток в вашем коде – charlietfl

+0

Можете ли вы изменить «квадратные» элементы, чтобы иметь новый атрибут? – BrunoLM

+0

Я не утверждал, что нашел решения - я заявил, что я прочитал несколько сообщений по этому вопросу по этому вопросу и просил высказать мнение о том, какой метод достижения является наиболее эффективным. – user3047072

ответ

2

Просто для простоты предположим, что у ваших элементов есть класс.

Example on jsFiddle

Так что, я бы захватить все элементы:

var elements = document.getElementsByClassName("square"); 

Тогда я хотел бы создать массив с идентификаторами

var ids = []; 

for (var i = 0; i < elements.length; ++i) 
{ 
    ids.push(elements[i].getAttribute("id")); 
} 

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

var random = roundingFunction(Math.random() * ids.length); 

Затем получить элемент по индексу и удалить из массива

var elementID = ids.splice(random, 1); 

и повторить.

+2

Спасибо @BrunoLM - его приятно знать, что здесь есть некоторые полезные люди. – user3047072

0

Есть Bascially три различных подхода:

  • Выберите элемент случайным и повторить, если он был использован ранее.
  • Поместите все элементы в массив, выберите случайные и удалите из массива.
  • Поместите все элементы в массив и перетасовывайте.

Какой из них наиболее эффективен, в ответе на ваш вопрос нельзя ответить. Разница между ними настолько мала, что она пренебрежимо мала, учитывая, насколько производительность отличается между браузерами.

Если вам действительно нужна самая эффективная, вам нужно попробовать все и проверить производительность в самых разных браузерах.

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

Смежные вопросы