Реализовал вариант выбора одного из нескольких объектов, с учётом сравнительной вероятности каждого.
Вот кусочек кода (всякие проверки я оттуда повыкинул для компактности).

Код AS3:
public class ProbableOneOf
{
private var _objArray: Array = []; // Массив объектов, выбираемых с определённой вероятностью
private var _chances: Vector.<Number> = new Vector.<Number>; // Массив сравнительных вероятностей
private var _ratings: Vector.<Number> = new Vector.<Number>; // Массив рейтингов выпадания, которые будут непосредственно сравниваться друг с другом
public function ProbableOneOf() {}
public function addObjChancePair(obj: * , chance: Number) : void
{
var rating: Number = Math.random() * chance;
_objArray.push (obj);
_chances.push (chance);
_ratings.push (rating);
}
public function getProbableObj() : *
{
while (_objArray.length > 1)
{
compareAndRemove();
}
return _objArray[0];
}
private function compareAndRemove() : void
{
if (_ratings[0] > _ratings[1])
{
removeAtIndex(1);
return;
}
if (_ratings[0] < _ratings[1])
{
removeAtIndex(0);
return;
}
removeAtIndex (Math.round(Math.random()));
}
private function removeAtIndex(index: uint) : void
{
_objArray.removeAt(index);
_chances.removeAt(index);
_ratings.removeAt(index);
}
То есть для каждого объекта выбрасываем случайное число от 0 до полученной сравнительной вероятности и возвращаем тот, у которого данный "рейтинг" наибольший. Как считаете, корректно с т.з. математики использовать такой подход?