Показать сообщение отдельно
Старый 17.10.2018, 12:20
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 7  
Ответить с цитированием
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
Реализовал вариант выбора одного из нескольких объектов, с учётом сравнительной вероятности каждого.
Вот кусочек кода (всякие проверки я оттуда повыкинул для компактности).

Код 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 до полученной сравнительной вероятности и возвращаем тот, у которого данный "рейтинг" наибольший. Как считаете, корректно с т.з. математики использовать такой подход?
__________________
Не сломано - не чини!