Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Случайная выборка из XMLList (http://www.flasher.ru/forum/showthread.php?t=145328)

Ivanaka 05.10.2010 02:07

Случайная выборка из XMLList
 
Здравствуйте,
Из XMLList, к примеру со ста элементами, необходимо выбрать 10 случайных и уникальных (не повторяющихся) элементов. Как такое реализовать? Пока в голову лезут трехэтажные алгоритмы сомнительной пользы...:umnik2:

wvxvw 05.10.2010 03:40

Код AS3:

private function randomTake():void 
{
        var list:XMLList =
        <>
                <foo attribute="0"/>
                <foo attribute="1"/>
                <foo attribute="2"/>
                <foo attribute="3"/>
                <foo attribute="4"/>
                <foo attribute="5"/>
                <foo attribute="6"/>
                <foo attribute="7"/>
                <foo attribute="8"/>
                <foo attribute="9"/>
        </>;
        var result:XMLList = list.copy();
        while (result.length() > 5)
        {
                delete result[Math.random() * result.length() >> 0];
        }
        trace(result);
}


Ivanaka 05.10.2010 10:32

Спасибо, wvxvw! Работает! Что-то подобное я и имел ввиду, сам бы до такого не додумался :)

Astraport 05.10.2010 10:59

Пример конечно очень прост, но не перемешивает итемы, они идут по порядку возрастания.

proxiServer 05.10.2010 11:06

Нафига их мешать, если и так выдает в случайном порядке?

Astraport 05.10.2010 11:41

Цитата:

Нафига их мешать, если и так выдает в случайном порядке?
Они все идут примерно так 1,4,5,8,9 или 0,2,3,5,8
Это считаете правильно?

wvxvw 05.10.2010 11:59

Про порядок никто не говорил :)
Код AS3:

private function test():void 
{
    var list:XMLList =
    <>
        <foo attribute="0"/>
        <foo attribute="1"/>
        <foo attribute="2"/>
        <foo attribute="3"/>
        <foo attribute="4"/>
        <foo attribute="5"/>
        <foo attribute="6"/>
        <foo attribute="7"/>
        <foo attribute="8"/>
        <foo attribute="9"/>
    </>;
    var child:int;
    var result:XMLList = new XMLList();
    while (result.length() < 5)
    {
        child = Math.random() * list.length();
        result += list[child];
        delete list[child];
    }
    trace(result);
}


proxiServer 05.10.2010 12:05

Тьфу) присмотрелся. первый вариант вообще на шутку похож)

Astraport 05.10.2010 13:09

Можно перемешать элементы массива вот так:
Код AS3:

protected function randomize(a:Array):void {
                                var i:Number = a.length;
                                if (i > 0) {
                                        while (--i) {
                                                var j:Number = Math.floor(Math.random() * (i + 1));
                                                var tmpi:Object = a[i];
                                                var tmpj:Object = a[j];
                                                a[i] = tmpj;
                                                a[j] = tmpi;
                                        }
                                }
                        }



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

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