Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как рандомно переставить элементы в массиве? (http://www.flasher.ru/forum/showthread.php?t=80908)

WWWD 08.06.2006 12:33

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

Iv 08.06.2006 12:36

всё зависит от задачи.
в принципе есть два варианта задачи:
произвольный и с обязательством не оставить ни одного на прошлом месте. надеюсь, первое.
тогда элементарно: идем сюда и ищем по слову 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/russi...top_search.gif
в поле "ключевые слова" вводим (не поверите): "случайная сортировка массива"

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

http://flasher.ru/forum/showthread.p...hlight=shuffle
(обратите внимание на дату создания темы)

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


Часовой пояс GMT +4, время: 06:37.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.