Попробовал сделать, как вы сказали.
- массив из 10 ячеек необходимо заполнить случайными цифрами от 0 до 9 с соблюдением ряда условий
- максимальное количество одинаковых цифр: единиц, двоек, троек по 4, 4-6 максимум по 3, 7-8 максимум по 2, девятка только одна

Код AS3:
var max_level:uint = 9; // максимальная цифра - пусть сейчас это будет 9
// вектор, который необходимо заполнить. Заполняем его нулями
var temp_vector:Vector.<uint> = new < uint > [0,0,0,0,0,0,0,0,0,0];
// если максимальный уровень = 0, то ничего не проверяем, везде остаются нули
if (max_level > 0) {
// создаём мешок с цифрами, откуда будем их вытаскивать
var bag:Vector.<uint>;
// в мешок суём все цифры до максимальной
// количество каждой цифы ставим максимальное (т.к. из 10 ячеек первая и последняя точно нули, то будем проверять только 8 ячеек, соответственно суём в мешок максимально возможное количество каждой цифры: 8 нолей, остальные смотря по цифре)
switch (max_level) {
case 1: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1]; break; //1 не более 4
case 2: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2]; break; //2 не более 4
case 3: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3]; break; //3 не более 4
case 4: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4]; break; //4 не более 3
case 5: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5]; break; //5 не более 3
case 6: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6]; break; //6 не более 3
case 7: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7]; break; //7 не более 2
case 8: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7,8,8]; break; //8 не более 2
case 9: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7,8,8,9]; break; //9 не более 1
}
var testee:uint=0; // проверяемая цифра
var previous1:uint = 0; // предыдущая цифра
var previous2:uint = 0; // предпредыдущая цифра
var tvl:int = temp_vector.length; // длина временного вектора для ссылки в цикле
// перебор каждой ячейки, кроме первой и последней (получается 8)
for (var i:int = 1; i < tvl - 1; i++) {
var bag_length:uint = bag.length; // длина мешка для ссылки в цикле
// достаём из мешка случайную цифру, пока не выпадет та, которая не совпадает с предыдущими двумя
while (testee == previous1) {
testee = bag[MyMath.randomRange(0, bag_length - 1)]
if (testee != previous2) {break }
}
// найдя подходящую цифру,
temp_vector[i] = testee; // заносим её в соответствующую ячейку временного вектора
previous2 = previous1; // записываем предыдущие цифры
previous1 = testee; // записываем предыдущие цифры
bag.splice(i, 1); // удаляем выбранную цифру из мешка
}
}
//проверяем, что получилось
trace('temp_vector='+temp_vector)
1. Выглядит не очень, поможете оптимизировать?
2. Не соблюдается правило "не больше 6 цифр, отличных от нуля". В какой момент и как