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

Lyso 06.11.2011 19:21

Рандом выдает далеко не случайное число
 
Для программы необходимо число от 0 до 3. Сделал такого вида рандом -
Код AS3:

var t:uint = Math.floor(Math.random() * 4);

Сделал больше 20 проверок по 10 000 раз, абсолютно всегда ноль выпадает в несколько раз реже остального. Как уравновесить шансы?

Newred 06.11.2011 19:27

Код AS3:

var t:uint = Math.ceil(Math.random()*4) - 1 ;


Lyso 06.11.2011 19:33

тогда выходит -1. а мне от 0 до 3

goodguy 06.11.2011 19:36

Цитата:

Сообщение от Lyso (Сообщение 1044177)
Для программы необходимо число от 0 до 3. Сделал такого вида рандом -
Код AS3:

var t:uint = Math.floor(Math.random() * 4);

Сделал больше 20 проверок по 10 000 раз, абсолютно всегда ноль выпадает в несколько раз реже остального. Как уравновесить шансы?

Странно, только что проверил:
Код AS3:

package  {
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Randomizer extends Sprite {
 
                private var _zeros:                int = 0;
                private var _ones:                int = 0;
                private var _twos:                int = 0;
                private var _threes:        int = 0;
 
 
                public function Randomizer() {
                        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 i:int = 0; i < 10000; i++) {
                                var rand:int = int(Math.random() * 4);
                                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);
                }
        }
}

трейс выводит:
Цитата:

zeros: 2473 ones: 2503 twos: 2492 threes: 2532
zeros: 2520 ones: 2591 twos: 2433 threes: 2456
zeros: 2573 ones: 2475 twos: 2482 threes: 2470
...
Это можно назвать примерно равными результатами

Lyso 06.11.2011 19:39

действительно странно, у меня ни в какую не хочет хоть более менее часто выводить ноль. math.ceil вообще ноль возвращать мне не будет...

Newred 06.11.2011 19:41

Код AS3:

var t:uint = Math.ceil(Math.random()*4 - 1) ;


goodguy 06.11.2011 19:42

Зачем тут вообще ceil?

Lyso 06.11.2011 19:49

воообще у меня вот такая функция, которая возвращает случайное число, кроме указанных в параметре. может в ней что-то не так...
Код AS3:

private function randExp(c:int = -1,c1:int = -1):int
                {
                        var t:int = Math.floor(Math.random() * 4);
                        trace(t);
                        return (t == c || t == c1)?randExp(c, c1):t;
                }


Newred 06.11.2011 19:56

Цитата:

Зачем тут вообще ceil?
Первое что пришло в голову.

Вот классная и простая реализация
Код 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;
        }


Lyso 06.11.2011 19:58

мне нужно еще с исключениями. ответ не должен быть равен с или c1.


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

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