![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Banned
|
Цитата:
Например так: Последний раз редактировалось toFL; 06.04.2012 в 14:20. |
|
|||||
|
Ответ неверный.
http://dl.************/u/71391385/Arr...zerTestApp.swf
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. Последний раз редактировалось ChuwY; 06.04.2012 в 16:05. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Кстати, а с чего вы решили, что если вставить рандом в функцию сортировки, то он вам равномерно перемешает массив? Ну т.е. почему у каждого эл-та с номером i шанс попасть на место j одинаковый?
Почему блин по нему просто не пройтись подряд и текущий эл-т поменять местами с рандомным?
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Так какая сортировка лучше?
1) public static function sortArrayByRandom(array:Array):Array { var arrayToRandom:Array=array; for (var i:uint = 0; i < arrayToRandom.length; i++) { var randomNumber:uint=int(Math.random()*arrayToRandom.length); arrayToRandom.push( arrayToRandom.splice( randomNumber, 1 )[0] ); } return arrayToRandom; } public static function sortArrayByRandom(array:Array):Array { function run (a:*, b:*) {return Math.random() > 0.5 ? -1 : 1;} return array.sort(run); } public static function sortArrayByRandom(...params):int { return [-1,0,1][int(Math.random()*3)]; } //... array.sort(ArrayTool.sortArrayByRandom); private var _currentArray : Array; public function FisherYatesRandomizer() { } public function getDescription():String{ return "Алгоритм Фишера-Йетса. Классический алгоритм для перемешивания массива. Довольно быстр и дает весьма приличное распределение"; } public function randomize(argArray : Array) : Array { if(!argArray){ return null; } _currentArray = argArray.slice(); startRandomize(); return _currentArray; } // private private function startRandomize():void{ var len : uint = _currentArray.length; while(len--){ var n : int = Math.random()*(len + 1); swap(len, n); } return ; } private function swap(x : uint, y : uint):void{ var temp : * = _currentArray[x]; _currentArray[x] = _currentArray[y]; _currentArray[y] = temp; } По тестам ChuwY я понял, что самый лучший и быстрый - FisherYatesRandomizer. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
В этом вашем FisherYatesRandomizer надо вместо len + 1 просто len и n неплохо бы uint сделать.
UPD: нет, с len всё нормально, см. ниже почему.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 08.04.2012 в 00:09. |
|
|||||
|
Спасибо. Исправил. Бес попутал.
А вот тут вас бес попутал. len при первом же вхождении в цикл на самом деле (_currentArray.length - 1), а Math.random() единицу не возвращает. Поэтому, чтобы захватить крайний элемент, прибавляем единицу. Добавлено через 45 часов 21 минуту Тк тоже сел писать свой твин, решил посмотреть все, что под руку попадутся. Первым же делом нарвался на неприятную ошибку вот здесь: * * CALL */ private function callFunction(func:String):void { var arr:Array=this['on'+func+'Params']; if(arr){ if(arr[1].length>0) if(arr[2]==true) arr[0](arr[1], this); else arr[0](arr[1]); else if(arr[2]==true) arr[0](this); else arr[0](); } } Советую почитать про apply/call. А если вы и собираетесь передавать массив, то лучше об этом сообщить в документации. "дополнительный параметр" тоже невнятный. Кстати, вот список тегов для асдоков. Примеры лучше оформлять с тегом code хотя бы. Или атрибутом example. Добавлено через 46 часов 19 минут К чести создателя, работает довольно шустро.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. Последний раз редактировалось ChuwY; 09.04.2012 в 13:53. |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:49. |
|
|
« Предыдущая тема | Следующая тема » |
|
|