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

in4core 30.01.2012 16:32

fish_r а у массива есть свойство indexOf ? или я что то не так понял...

DaFive 30.01.2012 17:00

http://help.adobe.com/ru_RU/FlashPla...t/3/Array.html

in4core 30.01.2012 17:07

угу вижу. просто никогда не пользовался

silin 30.01.2012 19:16

Цитата:

Сообщение от wvxvw (Сообщение 1060036)
Все равно, зачем 2 раза рандом вызывать?
..
ОК, вопрос снимается :)

а ведь ты прав, можно и с одним
Код AS3:

public function random(min:int, max:int, except:int):int
{
        var random:Number = Math.random();
        var ratio:Number = (except - min) / (max - min);
 
        if (random < ratio )
        {
                return min + int(random / ratio * (except - min));
        }
        else
        {
                return max - int((1 - random) / (1 - ratio) * (max - except));
        }
}


Nooob 30.01.2012 19:43

Тест на скорость и качество рандома, брались целые числа от 0 до 30 включительно, исключалось 5
Код AS3:

random1 ---------
0  =>  333440 0.0333
1  =>  332597 0.0333
2  =>  333305 0.0333
3  =>  332736 0.0333
4  =>  332711 0.0333
6  =>  334101 0.0334
7  =>  333831 0.0334
8  =>  332383 0.0332
9  =>  332962 0.0333
10  =>  332951 0.0333
11  =>  332498 0.0332
12  =>  333338 0.0333
13  =>  333087 0.0333
14  =>  333810 0.0334
15  =>  333477 0.0333
16  =>  333979 0.0334
17  =>  333544 0.0334
18  =>  333990 0.0334
19  =>  333006 0.0333
20  =>  334569 0.0335
21  =>  333063 0.0333
22  =>  332528 0.0333
23  =>  334435 0.0334
24  =>  332408 0.0332
25  =>  333202 0.0333
26  =>  333793 0.0334
27  =>  333052 0.0333
28  =>  334687 0.0335
29  =>  332766 0.0333
30  =>  333751 0.0334
max: 0.0335
min: 0.0332
time 5104
random2 ---------
0  =>  333387 0.0333
1  =>  333269 0.0333
2  =>  334142 0.0334
3  =>  332735 0.0333
4  =>  333304 0.0333
6  =>  334511 0.0335
7  =>  332390 0.0332
8  =>  333775 0.0334
9  =>  333638 0.0334
10  =>  334384 0.0334
11  =>  331774 0.0332
12  =>  333715 0.0334
13  =>  332765 0.0333
14  =>  333892 0.0334
15  =>  332855 0.0333
16  =>  333543 0.0334
17  =>  333384 0.0333
18  =>  333845 0.0334
19  =>  333176 0.0333
20  =>  333791 0.0334
21  =>  333333 0.0333
22  =>  333266 0.0333
23  =>  333152 0.0333
24  =>  333917 0.0334
25  =>  332545 0.0333
26  =>  332034 0.0332
27  =>  332994 0.0333
28  =>  333013 0.0333
29  =>  333907 0.0334
30  =>  333564 0.0334
max: 0.0335
min: 0.0332
time 4653
random3 ---------
0  =>  1667509 0.1668
6  =>  399696 0.04
7  =>  399660 0.04
8  =>  400894 0.0401
9  =>  399009 0.0399
10  =>  399507 0.04
11  =>  399832 0.04
12  =>  399777 0.04
13  =>  399750 0.04
14  =>  399956 0.04
15  =>  399588 0.04
16  =>  401202 0.0401
17  =>  399070 0.0399
18  =>  400281 0.04
19  =>  399702 0.04
20  =>  400266 0.04
21  =>  400008 0.04
22  =>  399781 0.04
23  =>  400112 0.04
24  =>  401127 0.0401
25  =>  399899 0.04
26  =>  333374 0.0333
max: 0.1668
min: 0.0333
time 4233

Код AS3:

function result(method:Function):void
{
        dic = new Dictionary();
        time = getTimer();
 
        for (i = 0; i < maxit; i++)
        {
                n = method(0,30,5);
                dic[n] ||0;
                dic[n]++;
        }
 
        var max:Number = 0;
        var min:Number = 30;
        var k:Number = 0;
 
        for (key in dic)
        {
                k = Math.round(dic[key] / maxit * 10000) / 10000;
                max = Math.max(max,k);
                min = Math.min(min,k);
                trace(key, " => ", dic[key], k);
        }
 
        trace("max:", max);
        trace("min:", min);
        trace("time", getTimer() - time);
}
 
var dic:Dictionary;
var i:int;
var n:int;
var key:String;
var time:uint;
var maxit:int = 10000000;
 
function random1(min:int, max:int, except:int):int
{
        if (Math.random() < (except - min) / (max - min))
        {
                return min + int(Math.random() * (except - min));
        }
        else
        {
                return max - int(Math.random() * (max - except));
        }
}
 
trace("random1 ---------");
result(random1);
 
 
function random2(min:int, max:int, except:int):Number
{
        max++;
        var rand:Number = min + int(Math.random() * (max - min - 1));
        return int(rand + Number(rand >= except));
}
 
trace("random2 ---------");
result(random2);
 
function random3(min:int, max:int, except:int):int
{
        var random:Number = Math.random();
 
        if (random < (except - min) / (max - min))
        {
                return min + int(random * (except - min));
        }
        else
        {
                return max - int(random * (max - except));
        }
}
 
trace("random3 ---------");
result(random3);


silin 30.01.2012 20:12

2й вариант в тесте будет еще быстрее, если его нормально записать
Код AS3:

function random2(min:int, max:int, except:int):int
{
        var rand:int = min + int(Math.random() * (max - min));
        return rand < except ? rand : ++rand;
}

а 3й должен быть в редакции из поста №34, иначе врет, выяснили уже ж

Korben 30.01.2012 22:27

Алгоритм раздачи случайного бонуса и т.п. :)

Я решал этот алгоритм по другому - создавался массив доступных чисел и потом удалялся случайный элемент.
Массив может жить долго с объектом и нет необходимости помнить какие числа надо игнорировать
:)

firuz 30.01.2012 22:29

А можно и рекурсией

Код AS3:

public function RecRand (_min:Number, _max:Number, _ex:Number) : Number {
                        var ran:Number = Math.round(Math.random() * (_max - _min)) + _min;
                        if (ran == _ex) {
                                trace("Выбросить ", ran);
                                return RecRand(_min, _max, _ex);
                        }
 
 
                        var ranNumb:Number = ran;
                        return ranNumb
                }


in4core 30.01.2012 23:53

Цитата:

var ranNumb:Number = ran;
return ranNumb
Апокрефично

firuz 31.01.2012 00:43

Цитата:

Сообщение от in4core (Сообщение 1060147)
Апокрефично

хахаха! я явно задумывал что-то дургое сначала! а потом забыл удалить :)
но ведь работает


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

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