PDA

Просмотр полной версии : как рандомно переставить элементы в массиве?


WWWD
08.06.2006, 12:33
Есть массив, состоящий например из 50 элементов, каждому из этих элементов присвоено значение от 1 до 50, как переиначить массив так, чтобы все эти цифры в нём рандомно перемешались?

Iv
08.06.2006, 12:36
всё зависит от задачи.
в принципе есть два варианта задачи:
произвольный и с обязательством не оставить ни одного на прошлом месте. надеюсь, первое.
тогда элементарно: идем сюда (http://proto.layer51.com/l.aspx?p=3) и ищем по слову shuffle

AlexSol
08.06.2006, 12:50
array.sort(sort);
function sort(a:Object, b:Object):Number {
return (Math.random()<.5) ? -1 : 1;
}

Cvazimodo
08.06.2006, 12:51
Если это массив объектов, то его можно сортировать по одному из параметров этих объектов.


var MyArray:Array = new Array();
var elem:Object = new Object();

for (var ii:Number=0; ii<50; ii++) {
elem = {key: random(1000), value:ii};
MyArray.push(elem);
}
MyArray.sortOn('key');

for (ii=0; ii<50; ii++) {
// выводит уже "случайные" элементы массива
trace(MyArray[ii].value);
}


Я делал это в задаче "тасования" карт в колоде (игрушку делал).

Iv
08.06.2006, 13:06
2AlexSol: предполагается, что если есть ответ выше, то имеет смысл отвечать, если ваш ответ лучше.
2Cvazimondo: предполагается, что ответ имеет отношение к вопросу.

Iv
08.06.2006, 13:17
2AlexSol: я к тому, что мой тест производительности (код ниже) дает разницу в 165 раз.
я бы сидел и не отсвечивал, если бы разница была каких 20%.Array.prototype.shuffle = function() {
var len = this.length;
var i = len;
while (i--) {
var j = random(len);
var n = this[j];
this[j] = this[i];
this[i] = n;
}
};
function sort(a:Object, b:Object):Number {
return (Math.random()<.5) ? -1 : 1;
}
// ----------- test
arr = [];
i = 10000;
while (i--) {
arr[i] = i;
}
t = getTimer();
arr.sort(sort);
trace((getTimer()-t));
t = getTimer();
arr.shuffle();
trace((getTimer()-t));
delete i, delete t;

Cvazimodo
08.06.2006, 13:18
Есть массив, состоящий например из 50 элементов, каждому из этих элементов присвоено значение от 1 до 50, как переиначить массив так, чтобы все эти цифтры в нём рандомно перемешались?
Я отвечал на этот вопрос. Мой ответ - рандомная сортировка элементов в массиве. В чем расхождение то?

Iv
08.06.2006, 13:21
сравни:
[...] Если это массив объектов [...]
[...] чтобы все эти цифтры в нём [...]

Cvazimodo
08.06.2006, 13:27
Ну и всё прекрасно. В объекте key для сортировки, а value - цифры, буквы, строки и любые другие объекты...

И, наверно, основной вопрос можно было бы охарактеризовать не как "цифры", а как "рандомная сортировка в массиве". Цифры, элементы массива - детали.

Nox Noctis
08.06.2006, 14:04
жмём сюда:
http://flasher.ru/forum/images/russian/style3/buttons/top_search.gif (http://flasher.ru/forum/search.php)
в поле "ключевые слова" вводим (не поверите): "случайная сортировка массива"

нажимаем ентер.
получаем одну-единственную тему в результатах.

http://flasher.ru/forum/showthread.php?t=60042&highlight=shuffle
(обратите внимание на дату создания темы)

там предложена куча вариантов сортировки, разной степени тормознутости и оригинальности. в том числе и вариант, который предложил Ив.

WWWD
08.06.2006, 15:18
2 Nox Noctis
Блин, затупил однако.

2 Iv
Спасибо, прямо вот то что нужно было

2 Cvazimodo
Спасибо за старания конечно но реально, зачем усложнять объеками если мне в данном случае именно тип Number нужен, только и всего.