Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 12.11.2012, 20:49
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 17  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
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));

Создать новую тему   Часовой пояс GMT +4, время: 18:47.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 18:47.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.