Случайность в JavaScript

Есть массив, элементы которого нужно вывести в случайном порядке, например, в слайд-шоу или в игре.
Это можно делать 3 способами: Можно выбирать случайный элемент и удалять его из массива, пока в массиве ничего не останется. Другой подход - перемешать элементы массива (2 способа), после чего их можно будет выводить или как-то обрабатывать по очереди.

Случайное число из заданного диапазона

Функция random

Для получения случайного номера элемента массива используем метод random() объекта Math, который возвращает псевдо-случайное число >= 0 и < 1.
Случайное число от 0 до n включительно:

Math.floor( Math.random( ) * (n+1) )

Случайное число в диапазоне от m до n:

function randomNumber (m,n)
{
 m =   parseInt(m);
 n = parseInt(n);
 return Math.floor( Math.random() * (n - m + 1) ) + m;
}

Извлечение элементов из массива

Функция splice

Изменяет содержимое массива, добавляя новые элементы и удаляя старые.
splice(index, howMany, [element1][, ..., elementN])
index - индекс начала изменения массива.
howMany - количество удаляемых элементов.
element1, ..., elementN - элементы, добавляемые в массив. Если новые элементы не заданы, выполняется удаление из массива.

Выбираем случайный элемент, обрабатываем его и удаляем из массива, затем выбираем случайный элемент из оставшихся и т.д..

function mytest(myarray)
{
  var i = myarray.length, j;
  alert(myarray.join());
  while(i)
  {
   j = Math.floor( (i--) * Math.random() );
   // ... обработка элемента myarray[j]
   myarray.splice(j, 1);
   // удаленный элемент и оставшиеся элементы массива:
   alert(j  + "n" + myarray.join()); // контроль
  }
  return this;
};

Перестановка элементов массива

Случайно выбранный элемент из n элементов массива меняем местами с последним (n) элементом. Затем случайно выбранный элемент из n-1 элементов массива меняем местами с последним (n-1) элементом и т.д..

/*
Если необязательный аргумент deep равен true, также
обрабатываются вложенные массивы
(по умолчанию false)
*/
Array.prototype.shuffle1 = function( deep )
{
  var i = this.length, j, t;
  while(i)
  {
   j = Math.floor( (i--) * Math.random() );
   t = deep && typeof this[i].shuffle!=='undefined' ? this[i].shuffle():this[i];
   this[i] = this[j];
   this[j] = t;
  }
  return this;
};

Примеры использования:

var a = new Array(1,2,3,4,5);
a.shuffle1();
alert(a.join());
// Перемешать, включая вложенные массивы:
a=['a','b','c',  [1,2,3,4,5], 'D','E','F'].shuffle1(true);
alert(a.join());

(источник: http://www.tigir.com/javascript.htm)

Сортировка

Функция sort

Используем метод sort(функция сравнения) класса Array:
Если функция сравнения не задана, массив сортируется в словарном порядке (каждый элемент преобразуется в строку), т.е. "10" идёт перед "2".

Функция сравнения

Функция сравнения определяет порядок сортировки.

function compare(a, b) {
 if (a меньше b)
  return -1; // после сортировки b идет перед a
 if (a больше b)
  return 1; // после сортировки b идет после a
 // иначе
 return 0; // после сортировки положение b и a не изменяестя
}

Для сравнения чисел функция сравнения может просто вычитать b из a:

function compareNumbers(a, b) {
  return a - b
}

Сортировка в случайном порядке

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

function shuffle2( array ) {
 array.sort(function() {return 0.5 - Math.random();});
 return true;
}

Пример использования:

function test() {
 var a = ['a','b','c', [1,2,3,4,5], 'D','E','F'];
 alert(a.join());
 shuffle2(a);
 alert(a.join());
}
<a href="#" onclick="test();">shuffle</a>
Опубликовано в рубрике JavaScript | с метками . |

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *