Обозреватель

Observer

понедельник, 14 января 2008 г.

expRandom. //Управление распределением вероятности

Оригинал. Блог одиноко стоящего игрока вспышки.

Иногда бывает нужно, чтобы случайное число с большей вероятностью выпадало ближе к минимальным, или максимальным значениям.
Простой пример - Слот машина.Бонусные символы должны выпадать гораздо реже обычных символов.Существует масса способов реализовать такой рандом, о них, к примеру была речь на форуме flash-mx
Более того мне необходимо, что бы числа возвращались в жестко заданном диапазоне.Немного мозгового скрипа дало мне вот такую функцию.

function expoRandom(range:Number,w:Number):Number {
w = Math.max(w,1);
w = Math.min(w,709);
return Math.log(1+Math.random()*(Math.exp(w)-1))*(range/w);
}

В функцию передается два параметра - собственно диапазон, и, не знаю как это правильно обозвать, степень разброса. От это степени зависит насколько сильно выпадающие значения будут тесниться к максимальному краю. Чем больше степень, тем ближе к краю.
В функцию вставлена небольшая проверка - чтобы ширина не была меньше 1 (в этом случае мы получим обычный рандом) и не была больше 709 (в этом случае выражение Math.exp(w) даст нам infinity). Их собсвенно можно убрать, дабы не забивать процессор лишней работой.
Вся магия тут завязана на простой принцип - есть график логарифма. Мы берем случайное число по оси X и находим его логарифм по оси Y. Немного корректируем под наш диапазон - и результат на лице.

Вот к примеру такой:http://bbexp.ru/blog/_stuff/random.html

1 комментарий:

Анонимный комментирует...

разработки классных часов разработка сайтов http://web-miheeff.ru разработки классных часов