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

Zebestov 14.01.2017 14:45

Велосипед не мой:
Код AS3:

package {
public class MyRandom {
 
        private static var _seed:int = Math.random() * 123456789;
 
        public function MyRandom() {}
 
        /** Случайное число от 0 до 1 или в заданном диапазоне. */
        public static function random(max:Number = 1.0, min:Number = 0.0):Number {
                _seed = (_seed * 9301 + 49297) % 233280;
                var rnd:Number = _seed / 233280;
                return min + rnd * (max - min);
        }
 
        public static function set seed(value:int):void {
                _seed = value;
        }
}
}


caseyryan 14.01.2017 18:58

В чем прикол?

Zebestov 14.01.2017 19:03

О чем речь?

caseyryan 14.01.2017 19:34

О велосипеде, который ты скинул
в чем суть подобных манипуляций?
Код AS3:

_seed = (MyUtils._seed * 9301 + 49297) % 233280;


Zebestov 14.01.2017 20:00

А чтоб я знал. Написал же, велосипед не мой. Работает отлично, я пользуюсь.
- разброс субъективно лучше, чем в нативном;
- скорость (вроде тесты делали) в разы выше;
- ну и самое главное — у него выдача полностью зависит от посева;

undefined 14.01.2017 20:57

а что за класс MyUtils?

Zebestov 14.01.2017 21:24

А блин )) сейчас исправлю. Нет там ничего такого.

Nooob 15.01.2017 10:51

Вложений: 1
Лучший генератор это http://www.math.utah.edu/~pa/Random/Random.html
Код AS3:

seed = (seed * 16807) % 0x7fffffff

Zebestov твой вариант рандома не лучше нативного:
Код AS3:

[SWF(width="400", height="400")]
        public class TestBitmap extends Sprite
        {
                public function TestBitmap()
                {
                        super();
                        test1();
                        test2();
                        test3();
                }
 
                private function test1():void
                {
                        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 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));
                        }
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 0;
                        bitmap.y = 0;
                        addChild(bitmap);
                }
 
                private function test2():void
                {
                        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);
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(random(200), random(200), random(0xffffff));
                        }
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 200;
                        bitmap.y = 0;
                        addChild(bitmap);
                }
 
                private function test3():void
                {
                        var bitmapData:BitmapData = new BitmapData(200, 200, false, 0xffffff);
                        for (var i:int = 0; i < 100000; i++)
                        {
                                bitmapData.setPixel(Math.random() * 200, Math.random() * 200, Math.random() * 0xffffff);
                        }
                        var bitmap:Bitmap = new Bitmap(bitmapData);
                        bitmap.x = 0;
                        bitmap.y = 200;
                        addChild(bitmap);
                }
        }

Верхний слева твой, снизу слева нативный

undefined 15.01.2017 12:28

замерил время - вышло что самый быстрый таки родной :D
Цитата:

test1 112
test2 64
test3 26

Nooob 15.01.2017 13:28

Цитата:

Сообщение от undefined (Сообщение 1198569)
замерил время - вышло что самый быстрый таки родной :D

Измерять нужно в релизном плеере
Код:

test1 810
test2 793
test3 704

при n 10000000 разница не существенна, поэтому не имеет смысла


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

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