Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как "перемешать" элементы в массиве? (http://www.flasher.ru/forum/showthread.php?t=187036)

mihael_p 12.11.2012 12:26

Как "перемешать" элементы в массиве?
 
Есть определенный массив:
Код AS3:

private var someDigits:Array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

как отсортировать массив - понятно, а вот как перемешать его - нет.
Подскажите, пожалуйста, как быть?

КорДум 12.11.2012 12:28

Как-то ваял.
Код AS3:

package ru.kordum.utils {
 
        /**
        * @author KorDum
        */

 
        public class ArrayShuffler {
                private static var _array:Array;
 
                //---------------------------------------------------------------------------
                //
                // CONSTRUCTOR
                //
                //---------------------------------------------------------------------------
 
                public function ArrayShuffler() {
 
                }
 
 
                //---------------------------------------------------------------------------
                //
                // PRIVATE STATIC METHODS
                //
                //---------------------------------------------------------------------------
 
                private static function startRandomize():void {
                        var length:uint = _array.length;
 
                        while (length--) {
                                var n:int = Math.random() * (length + 1);
                                swap(length, n);
                        }
                }
 
 
                private static function swap(x:uint, y:uint):void{
                        var temp:* = _array[x];
                        _array[x] = _array[y];
                        _array[y] = temp;
                }
 
 
                //---------------------------------------------------------------------------
                //
                // PUBLIC STATIC METHODS
                //
                //---------------------------------------------------------------------------
 
                public static function randomize(array:Array, count:uint = 1):Array {
                        if (!array) return null;
 
                        _array = array.slice();
 
                        for (var i:uint = 0; i < count; i++) {
                                startRandomize();
                        }
 
                        return _array;
                }
        }
}


udaaff 12.11.2012 13:01

Код AS3:

public static function shuffle(array:Array):void
{
        var t:*;
        var r:int;
        var i:int = array.length;
        while (i)
        {
                r = Math.floor(Math.random() * i--);
                t = array[i];
                array[i] = array[r];
                array[r] = t;
        }
}


КорДум 12.11.2012 13:31

У меня то же самое, но с приведением рандома с нормальных законом распределения к более-менее равномерному (у Чуви взял). Последствия очевидны.

mihael_p 12.11.2012 13:49

КорДум спасибо огромное, то что нужно:)

udaaff 12.11.2012 13:51

Цитата:

но с приведением рандома с нормальных законом распределения к более-менее равномерному
В моём примере какое-то другое распределение?

КорДум 12.11.2012 13:56

По идее, нормальное ) Math.random() в as3 живет по этому закону. Чуви проводил эксперименты, рисовал графики. Потом дошел до метода какого-то там, наваял код, приводящий нормальное к равномерному, а я нагло стырил.

Добавлено через 8 минут
А хотя по коду то же самое вообще у нас. Разве что у меня несколько раз можно "шуффлировать".

strangedk 12.11.2012 16:25

Код AS3:

var _source:Array = [1,2,3,4,5,6,7,8,9,0];
var _result:Array = [];
 
while (_source.length > 0) {
    _result.push(_source.splice(Math.round(Math.random() * (_source.length - 1)), 1)[0]);
}


Astraport 12.11.2012 16:52

Пользуясь случаем.
Вот например я таким способом перемешиваю итемы которые должны появиться в игре. Итемов поровну - хороших (здоровье, броня) и плохих (мины, враги). И герой может выпить эликсир и его удача вырастает на 10%, на 20% или даже на 50%. Соответственно, нужно чтобы в этом массиве вероятность появления положительных итемов также вырастала (в зависимости от выпитого эликсира удачи).

Вот как такое лучше сделать?

alexcon314 12.11.2012 17:20

Astraport, не ясно, как это может соотноситься с перемешиванием.
"вероятность появления" тех или иных элементов в массиве и перемешивание (т.е. изменение порядка следования) элементов никак не соотносятся.
скорее тут надо рассмотреть формирование самого массива изначально.


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

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