Перемешивание массива на JavaScript
Перемешивание массива на JavaScript
Несмотря на особенности сортировки массивов в JavaScript, которые нашли отражение даже в интернет-мемах, без этой самой сортировки не обойтись. Случайное перемешивание массива - тоже своеобразный вариант сортировки. Для его реализации в этих ваших интернетах обычно рекомендуют воспользоваться следующим или каким-то подобным кодом:
Code (JavaScript) : Убрать нумерацию
- var test_array=[1,2,3,4,5,6,7,8,9,10];
- test_array.sort(
- function() { return (Math.random()-0.5); }
- );
- // test_array -> перемешанный массив
Если нужно качественное перемешивание массива, то я пользуюсь следующей функцией. Помню, что-то подобное мы делали на школьных уроках информатики.
Code (JavaScript) : Убрать нумерацию
- //-------------------------------------------------
- // Функция случайной сортировки массива
- //-------------------------------------------------
- function shuffle(ar) {
- var j, tmp;
- for(var i=0; i<ar.length; i++) {
- // Случайный индекс элемента для обмена
- do {
- j=parseInt(Math.random()*ar.length);
- } while(i==j);
- // Обменять местами два элемента массива
- tmp=ar[i];
- ar[i]=ar[j];
- ar[j]=tmp;
- }
- return ar;
- };
- // Перемешать массив
- var test_array=[1,2,3,4,5,6,7,8,9,10];
- shuffle(test_array);
- // test_array -> перемешанный массив
Просмотров: 1669 | Комментариев: 1
Метки: JavaScript, полезные функции
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Добавить комментарий
Заполните форму для добавления комментария
https://ru.wikipedia.org/wiki/...ный_алгоритм
https://en.wikipedia.org/wiki/...rn_algorithm
Например, вот: https://stackoverflow.com/ques...wer-12646864
Насчет проверки равномерности можно попробовать из массива с несколькими наборами 0…255 собрать черно-белые картинки на canvas'е – чем-то подобным наглядно видно, насколько хорошо сделана реализация самого random().
И можно, если это действительно необходимо, использовать
https://developer.mozilla.org/...RandomValues
Выглядит, впрочем, для большинства нужд чрезмерно:
var arr = [];
for(var i = 1; i <= 10; ++i)
arr.push(i);
shuffle(arr);
function shuffle(arr) {
var i = arr.length;
while(--i) {
var rnd = Math.floor(random()*(i + 1));
var tmp = arr[i];
arr[i] = arr[rnd];
arr[rnd] = tmp;
}
return arr;
}
function random() {
var crypto = (function() {
var crypto = window.crypto || window.msCrypto || null;
if(crypto && "getRandomValues" in crypto && "Uint32Array" in window)
return crypto;
return null;
})();
random = crypto
? function cryptoRandom() {
try { // Note: shouldn't throw per new spec
var rnd = cryptoRandom.__rndArr || (cryptoRandom.__rndArr = new Uint32Array(1));
crypto.getRandomValues(rnd);
return rnd[0]/0x100000000;
}
catch(e) {
setTimeout(function() { throw e; }, 0);
return Math.random();
}
}
: function() {
return Math.random();
};
return random();
}