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

Ookami 06.11.2011 20:01

Код AS3:

var t:Number = beetwin( 0, 3 ) ; // от 0 до 3 
 
        private function beetwin(param0:int, param1:int):Number
        {
                var temp:Number = param0 + Math.floor(Math.random() * (param1 - param0)) ;
                return (temp == param0 || temp == param1)?beetwin(param0, param1):temp;
        }

Добавлено через 2 минуты
или даже так, универсальнее:
Код AS3:

var t:Number = beetwin( 0, 3, false ) ; // от 0 до 3, не включать границы диапазона в результат
 
        private function beetwin(param0:int, param1:int, incl:boolean):Number
        {
                var temp:Number = param0 + Math.floor(Math.random() * (param1 - param0)) ;
                if ( incl ) {
                        return temp;
                } else {
                        return (temp == param0 || temp == param1)?beetwin(param0, param1, incl):temp;
                }
        }


Lyso 06.11.2011 20:03

две переменных использовать как минимум, как максимум, как первое исключение и как второе. бубна не хватает.

Ookami 06.11.2011 20:05

В данном примере параметр incl указывает, надо ли включать границы диапазона в результат. Но можно наверное еще оптимальнее сделать

Lyso 06.11.2011 20:09

вы наверно не поняли что мне нужно..

Newred 06.11.2011 20:21

Цитата:

Для программы необходимо число от 0 до 3.
ответ на этот вопрос был дан.

Цитата:

мне нужно еще с исключениями. ответ не должен быть равен с или c1.
Телепатических способностей не имею, что такое с1 и с ?

Ookami 06.11.2011 20:21

Да, немного не так понял. Перечитал ваш код - все нормально на первый взгляд... Да и на второй тоже. Запустил у себя тест аналогично goodguy, получил zeros: 2493 ones: 2544 twos: 2484 threes: 2479

Lyso 06.11.2011 20:21

два параметра, коими не должен быть рандом.

Ookami 06.11.2011 20:22

Newred, с1 и с2 это значения, которые надо исключить из результат

crazyone 06.11.2011 20:26

Этому методу excludedRand, конечно, не хватает проверки на валидность аргументов, но если все правильно задавать, то работает путем:
Код AS3:

package  {
        import flash.display.Sprite;
        import flash.net.FileReference;
        /**
        * ...
        * @author DoctorSTaL
        */

        public class TestClass extends Sprite{
 
                public function TestClass() {
                        super();
 
                        var max:int = 10;
 
                        var resArr:Vector.<int> = new Vector.<int>(max);
                        var r:int;
 
                        var i:int = 10000;
                        while(i--){
                                r=excludedRand(max,1,5,7,3);
                                resArr[r]++;
                        }
                        i = max;
                        while (i--) {
                                trace(i+" : "+resArr[i]);
                        }
                }
 
                private function excludedRand(max:uint, ...excludes):uint {
                        if (max <= excludes.length) throw(new ArgumentError("To many excludes."));
                        if (excludes.sort(Array.NUMERIC|Array.UNIQUESORT) == 0) throw(new ArgumentError("You must use unique exclusions due to use excludedRand."));
                        if (excludes[excludes.length - 1] >= max) throw(new ArgumentError("All exclusions shoud be less than max value."));
 
                        var len:uint = max - excludes.length;
                        var res:uint = uint(Math.random() * len);
                        for (var i:int = 0; i < excludes.length; i++) {
                                if (res >= excludes[i]) res++; else break;
                        }
                        return res;
                }
        }
 
}


Ookami 06.11.2011 20:26

Код с вашей функцией:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
 
                private var _zeros:                int = 0;
                private var _ones:                int = 0;
                private var _twos:                int = 0;
                private var _threes:        int = 0;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        for (var j:int = 0; j < 10; j++ ) {
                                _zeros = 0;
                                _ones = 0;
                                _twos = 0;
                                _threes = 0;
                                for (var i:int = 0; i < 10000; i++) {
                                        var rand:int = randExp();
                                        if (rand == 0) _zeros++;
                                        else if (rand == 1) _ones++;
                                        else if (rand == 2) _twos++;
                                        else if (rand == 3) _threes++;
                                }
                                trace("zeros: " + _zeros, "ones: " + _ones, "twos: " + _twos, "threes: " + _threes);
                        }
                }
 
                private function randExp(c:int = -1,c1:int = -1):int {
                        var t:int = Math.floor(Math.random() * 4);
                        return (t == c || t == c1)?randExp(c, c1):t;
                }
        }
 
}

Трейс:
zeros: 2481 ones: 2619 twos: 2444 threes: 2456
zeros: 2518 ones: 2515 twos: 2515 threes: 2452
zeros: 2513 ones: 2517 twos: 2503 threes: 2467
zeros: 2506 ones: 2462 twos: 2560 threes: 2472
zeros: 2535 ones: 2474 twos: 2477 threes: 2514
zeros: 2470 ones: 2533 twos: 2541 threes: 2456
zeros: 2503 ones: 2448 twos: 2539 threes: 2510
zeros: 2532 ones: 2478 twos: 2445 threes: 2545
zeros: 2611 ones: 2406 twos: 2418 threes: 2565
zeros: 2583 ones: 2475 twos: 2432 threes: 2510

Не вижу проблемы с распределением нулей - все значения примерно поровну.


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

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