Тест на скорость и качество рандома, брались целые числа от 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);