LINUX.ORG.RU
ФорумTalks

[Объясните тупню] Функция плотности вероятности для спавна монстров


0

0

Вот я тут недавно саморекламировался:

http://sourceforge.net/projects/tprpg/

Теперь суть вопроса: захотел я сделать нормальную функцию генерирования монстров. Для этого хочу придумать функцию (в мат. смысле) плотности вероятности появления монстра конкретной сложности (сложность монстра это значение от 1 до 15) от некой переменной x. Далее посчитать вероятность появления (интегрируя плотность вероятности по x, скажем от d-1 до d, где d - сложность) и умножить на кол-во монстров в целом. Напихать полученное число монстров данной сложности на карту.

Вопрос: какую функцию плотности вероятности использовать (что-бы легко интегрировалась и программировалась)? Подумал было использовать a*exp(-1.5*x^2), но что-то не нормируется (вроде exp(-x^2) вообще не инт-ма, или я не прав?). x принадлежит от 0 до 15.

Какие есть идеи? Или всё можно сделать проще?

Вроде бы делают N бросков M-гранной игральной кости, и суммируют выпавшее.

> Далее посчитать вероятность появления (интегрируя плотность вероятности по x, скажем от d-1 до d, где d - сложность) и умножить на кол-во монстров в целом. Напихать полученное число монстров данной сложности на карту.


У тебя получается, что для данного X число монстров каждого уровня предопределено. Так и задумано? Можно было бы для каждого монстра его уровень рассчитывать без оглядки на остальных монстров, типа for(int i = 0; i < n_monsters; ++i) monster[i].level=rand(x);

Manhunt ★★★★★
()

> вроде exp(-x^2) вообще не инт-ма

Неопределённого интеграла нет (в смысле, не выражопывается через элементарные функции), но, скажем, интеграл от 0 до ∞ вполне берётся.

Miguel ★★★★★
()
Ответ на: комментарий от Manhunt

> Вроде бы делают N бросков M-гранной игральной кости, и суммируют выпавшее.

Я так урон считаю.

> У тебя получается, что для данного X число монстров каждого уровня предопределено. Так и задумано?

Да, изъянчик. Хотя пик функции, конечно должен двигаться помере прокачки персонажа.

> Можно было бы для каждого монстра его уровень рассчитывать без оглядки на остальных монстров, типа for(int i = 0; i < n_monsters; ++i) monster[i].level=rand(x);

Не, суть в том, что сложность - вещь фиксированная.

shamazmazum
() автор топика
Ответ на: комментарий от Anoxemian

> ты разрабатываешь тесты английского языка?

Таки что я разрабатываю?

shamazmazum
() автор топика
Ответ на: комментарий от Manhunt

> Вроде бы делают N бросков M-гранной игральной кости, и суммируют выпавшее.

Ура, щас тока дошло. Можно делать бросков тем больше, чем этого требует уровень перса и сложность монстра, а граней по кол-ву монстров, которых осталось добавить.

Например перс 6 уровня, значит для монстров 6 уровня делаем скажем 5 бросков, а для 3 и 11 2 броска. Грани подбераем так, чтобы общее число монстров не превышало максимума.

Хотя тоже не идеальный вариант.

shamazmazum
() автор топика

>что-бы легко интегрировалась и программировалась

Если надо абсолютно непрерывное распределение, то можно использовать http://ru.wikipedia.org/wiki/Распределение_Парето (двухпараметрическое: число монстров - k, сложность монстра - параметр m).

>Или всё можно сделать проще?

http://ru.wikipedia.org/wiki/Распределение_Пуассона

Определяет число монстров, появившихся за фиксированное время, при условии, что их генерирование происходит с некоторой фиксированной средней интенсивностью и независимо друг от друга.

quickquest ★★★★★
()

Мммм.. если f - функция плотности, то возьми банально за интеграл от (d-1) до d значение:

f(d-1/2). В конце концов не полет на Луну считаешь, правда? И тут уж функцию на свой выбор.

ЗЫ да и вообще. Разве распределение вероятности не должно быть продиктовано требованиями к геймплею, а не легкостью интегрирования или чем-то еще?

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

> f(d-1/2)

Почему я сам так не сделал?

> Разве распределение вероятности не должно быть продиктовано требованиями к геймплею

Подбором параметров итд итп я конечно выберу наиболее оптимальную для геймплея.

shamazmazum
() автор топика
Ответ на: комментарий от shamazmazum

>> Разве распределение вероятности не должно быть продиктовано требованиями к геймплею

>Подбором параметров итд итп я конечно выберу наиболее оптимальную для геймплея.


Раз пошла такая пьянка, предлагаю использовать кусочно-линейную функцию плотности вероятности. И под геймплей легко подстраивается, и с интегрированием проблем никаких.

Manhunt ★★★★★
()

>Функция плотности вероятности

> exp(-x^2) вообще не инт-ма

Раз такая пьянка надо читать матан, а не мучать всех вопросами. И не употреблять незнакомых слов, если не то пошло. Не верю, что человек сдал тервер и ни разу не видел нормального распределения.

По теме. т.к. у тебя ф-я не непрерывная, то по случайной величине имеет смысл брать кусочно постоянную(как уже говорили). При этом по сложности, времени, фап-пер-сек игрока она может быть достаточно сложной. Интегрировать, имхо, не понадобится.

Или можете решать уравнение l1+l2+l3+l4+....+ln=slojnost*abrakadabra где li - это уровень i-го монстра.

или добавить к li вес(коэффициент обозначающий прибавку к сложности. )

или даже перечитать, например, Гмурмана.

p.s. Да, ваш вариант не имеет отношения к теории вероятностей. Спасибо

gvozdila
()
Ответ на: комментарий от gvozdila

Ах да,

p.p.s интеграл от нормального распределения берется очень быстро. или по !небольшой! таблице с отличной точностью. Проблема скорости, в данном случае, надумана.

gvozdila
()

Про подсчёт сумм на костях обсуждали здесь: www.linux.org.ru/view-message.jsp?msgid=3691850

Кратко: при A бросках B-гранной кости AdB получается B^A вариантов дающих суммы от A (A раз выпало 1) до A*B (A раз выпало B). Вероятности считаются через производящую функцию:

      ⎛ B   n ⎞ A
      ⎜ ∑  z  ⎟
      ⎝n=1    ⎠
P(z)= ————————————
             A
            B

Коэффициент при z в степени Х и будет равен вероятности получить при броске X. Это распределение очень быстро стремится к нормальному.

question4 ★★★★★
()
Ответ на: комментарий от question4

Согласно замечанию www_linux_org_ru, можно переписать производящую функцию в виде

P(z)= { z * (z^B - 1) / (z - 1) / B } ^ A

Хотя мне, как человеку, пропинавшему тфкп, профит не очевиден.

Manhunt ★★★★★
()
Ответ на: комментарий от gvozdila

> И не употреблять незнакомых слов

Извини, уж. Имел ввиду неопр. интеграл не выражается в элементарных функциях.

> p.s. Да, ваш вариант не имеет отношения к теории вероятностей.

Не скажи. Можно потом вероятность не на Nобщее умножать (здесь вы правы), а придумать какой нибудь алгоритм подсчета кол-ва монстров на основе тех же костей.

Вообще, вы назовете меня школьником, у меня ещё не было тервера.

shamazmazum
() автор топика
Ответ на: комментарий от Manhunt

Согласно замечанию www_linux_org_ru, можно переписать производящую функцию в виде

> P(z)= { z * (z^B - 1) / (z - 1) / B } ^ A

Хотя мне, как человеку, пропинавшему тфкп, профит не очевиден.

Легче считать, по идее. По ссылке я, правда, воспользовался maxima, поэтому лёгкость не оценил. Имхо, можно свести к биноминальным коэффициентам, но я не довёл расчёт до конца.

question4 ★★★★★
()
Ответ на: комментарий от question4

n-тый коэффициент ряда Тейлора функции P(z) находится на минуспервом место ряда Лорана функции P(z)/z^(n+1)

минуспервый коэффециент ряда Лорана равен вычету функции в нуле

вычет в нуле есть интеграл по маленькому замкнутому контуру вокруг нуля, деленый на 2*pi*i

в качестве контура множно взять единичную окружность (ни внутри нее, ни на ней самой особых точек вроде бы нет)

посколько на единичной окружности |z|==1, удобно перейти к сферическим координатам (r, phi)

поскольку коэффециент действительнозначный, то нам нужна только действиетльная часть вычета (а комплексная должна быть всегда равна 0)

осталось выписать дествительню часть вычета в терминах phi и собственно взять интеграл. каким же тупым я себя ощущаю :(

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

Ни разделить действительную и мнимую части со сколько-нибудь разумным количеством выкладок, ни взять интеграл "как есть" без разложения на простейшие дроби (и вытекающей комбинаторикой) у меня не получается. Мда.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

Вы что то все усложняете. Все должно быть проще. Даже проще кусочно-непрерывной функции. Раз сложность монстра величина дискретная и по ней собираются интегрировать... То следует использовать дискретное распределение. Вероятности дискретного распределение либо придумать, либо заранее посчитать интеграл. Пределы интегрирования - величины дискретные. Или я чего то не понял? Но очевидно дискретное распределение самое не напряжное в плане вычислений. А у вас вроде все равно все сведется к дискретному распределению.

Hiki
()
Ответ на: комментарий от Hiki

Вкратце:

Хочется получить более-менее простую формулу для рапределения "A бросков B-гранной кости". Там довольно сложная комбинаторика, и чтобы в нее не ввязываться, товарищи предложили воспользоваться производящей функцией и вычетами. Я попробовал копнуть в этом направлении, но без особых успехов. Может, интегрировать разучился..

При условии |z|==1 и параметризации по phi легко посчитать любую степень z. Конкретнее, z(phi)^n==z(n*phi). А вот что делать с ((z^B-1)/(z-1))^A так и не соображу. Туплю?

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

>>поскольку коэффециент действительнозначный, то нам нужна только действиетльная часть вычета (а комплексная должна быть всегда равна 0)

>>осталось выписать дествительню часть вычета в терминах phi и собственно взять интеграл.

Не распарсил. Вычет-то от фи не зависит.

Интегрируем по фи, получаем вычет, причем по логике вещей он должен быть действительным, и руками ему обрубать комплексуню часть не нужно, а тем более до интегрирования... Это ведь имелось в виду?

gkrellm
()
Ответ на: комментарий от Manhunt

>>предлагаю использовать кусочно-линейную функцию плотности вероятности.

Блин, да не путайте вы Функцию распределения случайной величины и функцию плотности распределения вероятностей. Первая - интеграл от второй. В данном случае твоя мысль формулируется так: взять кусочно-постоянную функцию плотности, тогда необходимо функция распределения будет кусочно-линейной.

gkrellm
()
Ответ на: комментарий от Hiki

>>Но очевидно дискретное распределение самое не напряжное в плане вычислений.

Хочется математической четкости - а потому надо по-честному вычислить все вероятности. Но вроде бы там выходят адские факториалы (вывод формулы пока осиливать лень) поэтому упомянули про производящие функции (кстати всем было это мегаполезно).

gkrellm
()
Ответ на: комментарий от gkrellm

> Вычет-то от фи не зависит.

Подинтегральное выражение зависит.

> Интегрируем по фи, получаем вычет, причем по логике вещей он должен быть действительным, и руками ему обрубать комплексуню часть не нужно


Да.

> а тем более до интегрирования...


Э-ээ, это были размышления на тему, как бы упростить интегрирование. Судя по тому, что собственно интегрирование я не осилил, интереса они не представляют. Если все равно хочется понять, что имелось ввиду, можно прочитать следующий абзац.

До интегрирования выделим действительную и мнимую части подинтегрального выражения, и ... в общем, так:
z(phi) = x(phi) + i*y(phi)
f(z) = u(x+iy)+iv(x+iy)
f(z)dz = {u(x+iy)dx-v(x+iy)dy} + i{u(x+iy)dy+v(x+iy)dx}
Дальше можно интегрировать содержимое только одной из фигурных скобок, а содержимое второй после интегрирования все равно равно 0.

Manhunt ★★★★★
()
Ответ на: комментарий от gkrellm

> Блин, да не путайте вы Функцию распределения случайной величины и функцию плотности распределения вероятностей. Первая - интеграл от второй. В данном случае твоя мысль формулируется так: взять кусочно-постоянную функцию плотности, тогда необходимо функция распределения будет кусочно-линейной.

Не путаю. Мысль была в том, чтобы "колокол" плотности вероятностей нормального распределения можно аппроксимировать ломаной.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

.. или любую другую жулаемую функцию плотности вероятности. При этом функция распределения будет аппроксимирована кусочками парабол.

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

<занудство>
s/аппроксимирована/как бы аппроксимирована/
</занудство>

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

>>Судя по тому, что собственно интегрирование я не осилил, интереса они не представляют.

Ну зачем так, все верно же. Отлично подойдет для вычисления вычета по квадратному контуру. Просто меня смутила фраза "отбросить комплексную часть" - все же это немного иное.

gkrellm
()
Ответ на: комментарий от gkrellm

Сформулируйте исходную задачу почетче. Если кто понял. Я просто не очень разобрался. Но у меня предчувствие, что вычеты не нужны. Явно все можно сделать проще. И дискретное распределение вполне честное. Тем более, что как я уже писал, даже если использовать непрерывное распределение, то можно предварительными расчетами свести его к дискретному. А значит это надо сделать. Извиняюсь, за неточности в терминологии.

Hiki
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.