2Astraport
Я пользуюсь таким методом влияния на частоту рандомного выпадания элемента (похоже на лобовое решение КорДума):
Создаю массив, сорозмерный масиву элементов и в каждую его ячейку пихаю неотрицательное число. Чем больше чило, тем больше вероятность выпадания элемента с таким же индексом, как и это число. Для выборки случайного элемента нужно:
- просуммировать все числа (шансы на выпадание);
- выбросить рандомное число от нуля, до посчитаной суммы;
- пробегаясь от начала массива, суммировать все числа и сравнивать с полученым рандомны. Как толко текущая сумма будет равна выброшеному числу возвратить текущий индекс, если больше - предидущий индекс.
По этому индексу я и получаю свой долгожданный элемент из набора.
По идее, этот вариант имитирует запихание в один массив нескольких одинаковых эелементов. Но заменяет этот процесс указанием количества этих элементов.
Пример:

Код AS3:
var items:Array = [item0, item1, item2, item3, item4];
var chances:Array = [10, 10, 10, 3, 1];
function getRandItem(items:Array, chances:Array):* {
var sum:int = 0;
var i:uint = 0;
var len:uint = chances.length;
var rnd:uint = 0;
while (i < len) {
sum += chances[i++];
}
rnd = uint(Math.random() * sum);
sum = 0;
i = 0;
while (sum < rnd && i < len) {
sum += chances[i++];
}
i = (sum == rnd) ? (i - 1) : (i - 2);
return items[i];
}
trace("random item:", getRamdItem(items, chances));