Проверял с распределением. Но оно не показывало кое-что.
Ошибки есть и у меня и у вас.
Да, у вас с return'ом все нормально, но у вас 1 никогда не будет, а у меня, действительно, undefined бывает.
Все-таки нужно

Код AS1/AS2:
var rand:Number = Math.ceil(Math.random() * 29);
, не то

Код:
номер = 29, количество = 132
номер = 28, количество = 131
номер = 27, количество = 125
номер = 26, количество = 118
номер = 25, количество = 134
номер = 24, количество = 120
номер = 23, количество = 116
номер = 22, количество = 143
номер = 21, количество = 131
номер = 20, количество = 0
номер = 19, количество = 102
номер = 18, количество = 134
номер = 17, количество = 133
номер = 16, количество = 132
номер = 15, количество = 132
номер = 14, количество = 118
номер = 13, количество = 122
номер = 12, количество = 116
номер = 11, количество = 131
номер = 10, количество = 0
номер = 9, количество = 115
номер = 8, количество = 127
номер = 7, количество = 131
номер = 6, количество = 128
номер = 5, количество = 143
номер = 4, количество = 152
номер = 3, количество = 127
номер = 2, количество = 138
номер = 1, количество = 0
номер = 0, количество = 0
Вот как я проверял:

Код AS1/AS2:
var TEST:Array = new Array();
for (i = 0; i < 30; i++) {
TEST[i] = 0;
}
function myRand ():Number {
var rand:Number = Math.ceil(Math.random() * 29);
if (rand == 10 || rand == 20) {
myRand ();
}
else {
TEST[rand]++;
return rand;
}
}
id = setInterval(myRand, 1);
test_btn.onRelease = function () {
clearInterval(id);
for (i in TEST) {
trace ('номер = ' + i + ', количество = ' + TEST[i]);
}
}
Ваш вариант:

Код AS1/AS2:
var TEST:Array = new Array();
for (i = 0; i < 30; i++) {
TEST[i] = 0;
}
function myRand ():Number {
var rand:Number = Math.ceil(Math.random() * 28)+1;
if(rand == 10) rand = myRand();
if(rand == 20) rand = myRand();
TEST[rand]++;
return rand;
}
//искомое число
num = myRand ();
id = setInterval(myRand, 1);
test_btn.onRelease = function () {
clearInterval(id);
for (i in TEST) {
trace ('номер = ' + i + ', количество = ' + TEST[i]);
}
}
Несколько неверно проверял.
Добавлено через 9 минут
Но вообще-то самая простая проверка дает нормальные результаты:

Код AS1/AS2:
function myRand (){
var rand:Number = Math.ceil(Math.random() * 29);
if (rand == 10 || rand == 20) {
myRand ();
}
else {
trace(rand)
}
}
id = setInterval(myRand, 100);