Форум 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=213767)

undefined 15.01.2017 13:38

а в релизном трейсы не работают

Nooob 15.01.2017 13:41

выводи в TextField

undefined 15.01.2017 13:50

не знаю у кого как, но у меня в релизном кажет:
Цитата:

test1:45
test2:27
test3:19
Добавлено через 32 секунды
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
 
        /**
        * ...
        * @author
        */

        public class Main extends Sprite
        {
                private var tf:TextField;
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        tf = new TextField();
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        var test:TestBitmap = new TestBitmap();
                        var res:Object;
                        res = test.test();
                        addChild(test);
                        for (var s:String in res)
                                tf.appendText(s + ":" + res[s] + "\n");
                        addChild(tf);
                }
 
        }       
}

Добавлено через 1 минуту
Код AS3:

package 
{
        /**
        * ...
        * @author
        */

        import flash.display.*;
        public class TestBitmap extends Sprite
        {
                public function TestBitmap()
                {
                        super();
                }
                function test():Object {
                        var res:Object = {};
                        res.test1 = test1();
                        res.test2 = test2();
                        res.test3 = test3();
                        return res;
                }
                private function test1():Number
                {
                        var seed:int = Math.random() * 123456789;
                        function random(min:Number = 0.0, max:Number = 1.0):Number
                        {
                                seed = (seed * 9301 + 49297) % 233280;
                                var rnd:Number = seed / 233280;
                                return min + rnd * (max - min);
                        }
                        var res:Number = (new Date()).getTime();
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(random(0, 200), random(0, 200), random(0, 0xffffff));
                        }
                        //trace("test1", (new Date()).getTime() - ts);
                        res = new Date().getTime() - res;
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 0;
                        bitmap.y = 0;
                        addChild(bitmap);
                        return res;
                }
 
                private function test2():Number
                {
                        var seed:int = Math.random() * 123456789;
                        function random(max:int):Number
                        {
                                seed = (seed * 16807) % 0x7fffffff;
                                return seed % max;
                        }
 
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        var res:Number = (new Date()).getTime();
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(random(200), random(200), random(0xffffff));
                        }
                        res = new Date().getTime() - res;
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 200;
                        bitmap.y = 0;
                        addChild(bitmap);
                        return res;
                }
 
                private function test3():Number
                {
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        var res:Number = (new Date()).getTime();
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(Math.random() * 200, Math.random() * 200, Math.random() * 0xffffff);
                        }
                        res = new Date().getTime() - res;
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 0;
                        bitmap.y = 200;
                        addChild(bitmap);
                        return res;
                }
        }
}

Добавлено через 6 минут
вывод - нефиг изобретать велосипед :D

Nooob 15.01.2017 14:09

Цитата:

Сообщение от undefined (Сообщение 1198573)
вывод - нефиг изобретать велосипед :D

есть такие задачи, где должен быть детерминированный рандом, которые нельзя решить нативным рандомом. например клиент-серверная симуляция (бой в RTS/TBS), где с идентичными входными данными должен быть одинаковых результат

Nooob 15.01.2017 15:11

Вложений: 1
Нашел еще один вариант:
Код AS3:

private static var seed1:int = getTimer();
public static function random1 ():Number
{
        seed1 = (seed1 * 214013 + 2531011) % 0x7fffffff;
        return seed1 / 0x7fffffff;
}

И еще один из недр tamarin-central перевел на AS3, он должен быть идентичен флешовому, но выглядит страшно:
Код AS3:

private static var seed:uint = getTimer();
public static function random3 ():Number
{
        var aNum:uint = (seed = ((seed & 1) ? ((seed >> 1) ^ 0x48000000) : (seed >> 1))) * 71;
        aNum = ((aNum << 13) ^ aNum) - (aNum >> 21);
        var iResult:uint = (aNum * int(aNum * aNum * 15731 + 789221) + 1376312589) & 0x7fffffff;
        iResult += aNum;
        iResult = ((iResult << 13) ^ iResult) - (iResult >> 21);
        return (iResult & 0x7fffffff) / (0x7fffffff + 1.0);
}

Test:
Код AS3:

        [SWF(width = "400", height = "500")]
        public class Test2 extends Sprite
        {
                private var text:TextField;
 
                public function Test2 ()
                {
                        super();
 
                        text = new TextField();
                        text.y = 400;
                        text.height = 100;
                        addChild(text);
 
                        test1();
                        test2();
                        test3();
                        test4();
                }
 
                private static var seed1:int  = getTimer();
                public static function random1 ():Number
                {
                        seed1 = (seed1 * 214013 + 2531011) % 0x7fffffff;
                        return seed1 / 0x7fffffff;
                }
 
                private function test1 ():void
                {
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        var time:int              = getTimer();
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(random1() * 200, random1() * 200, random1() * 0xffffff);
                        }
                        text.appendText("test1 " + (getTimer() - time) + "\n");
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 0;
                        bitmap.y = 0;
                        addChild(bitmap);
                }
 
                private static var seed2:int  = getTimer();
                public static function random2 ():Number
                {
                        seed2 = (seed2 * 16807) % 0x7fffffff;
                        return seed2 / 0x7fffffff;
                }
 
                private function test2 ():void
                {
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        var time:int              = getTimer();
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(random2() * 200, random2() * 200, random2() * 0xffffff);
                        }
                        text.appendText("test2 " + (getTimer() - time) + "\n");
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 200;
                        bitmap.y = 0;
                        addChild(bitmap);
                }
 
                private static var seed3:uint = getTimer();
                public static function random3 ():Number
                {
                        var aNum:uint = (seed3 = ((seed3 & 1) ? ((seed3 >> 1) ^ 0x48000000) : (seed3 >> 1))) * 71;
                        aNum = ((aNum << 13) ^ aNum) - (aNum >> 21);
                        var iResult:uint = (aNum * int(aNum * aNum * 15731 + 789221) + 1376312589) & 0x7fffffff;
                        iResult += aNum;
                        iResult = ((iResult << 13) ^ iResult) - (iResult >> 21);
                        return (iResult & 0x7fffffff) / (0x7fffffff + 1.0);
                }
 
                private function test3 ():void
                {
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        var time:int              = getTimer();
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(random3() * 200, random3() * 200, random3() * 0xffffff);
                        }
                        text.appendText("test3 " + (getTimer() - time) + "\n");
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 0;
                        bitmap.y = 200;
                        addChild(bitmap);
                }
 
                private function test4 ():void
                {
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        var time:int              = getTimer();
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(Math.random() * 200, Math.random() * 200, Math.random() * 0xffffff);
                        }
                        text.appendText("test4 " + (getTimer() - time) + "\n");
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 200;
                        bitmap.y = 200;
                        addChild(bitmap);
                }
        }


Zebestov 15.01.2017 17:04

Цитата:

Сообщение от Nooob (Сообщение 1198568)
Zebestov твой вариант рандома не лучше нативного

Во-первых, не мой, а используемый мною в моих проектах.
Во-вторых, лучше, например, в деле перемешивания небольших массивов. Натив мешает отвратительно.
В-третьих, лучше уже хотя бы потому, что имеет повторяемость при одном и том же seed (это ты и сам указал чуть позже, да)
Такова практика.
Алгоритмы "идентичные нативному" беру на карандаш. Но опять же, как раз во втором пункте они работают хуже, так что я даже рад тому, как мешает выбранный мной когда-то первый вариант.
Годная тема поднялась! Много полезного ) топикстартер, поди, в шоке!

undefined 15.01.2017 17:41

Цитата:

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

Zebestov 15.01.2017 17:47

Требование: "максимально рассыпчато" перемешать массив из N нулей и M единиц.
– Вариант, который выбрал я и который кочует у меня из AS в JS — отлично!
– Нативный рандом — кол!

undefined 15.01.2017 17:53

а ну это критерий нравится/не нравится, его не проверишь

Zebestov 15.01.2017 17:56

Нет. Это критерий минимальной длины неперемешанных рядов единиц и нулей.


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

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