Добавлен Borodach
constant int min = 20
constant int max = 100
function some takes int x, int y returns int
int itteration = y-x
return ?
endfunction
Функция должна возвращать значение от 20 до 100(если итераций больше 1) в геометрической прогрессии.
Принятый ответ
А вот сейчас будет пример, где чем больше уровень предмета, тем выше шанс выпадения способности его уровня.
Пусть для каждого предмета уровня m задан шанс выпадения способности уровня m - P_m. Причём для предмета уровня n и 1 данный шанс равен 1 (100%). Пусть также задан P_2 - шанс выпадения способности уровня 2 для предмета уровня 2.
Пусть P_m = P_2 + (1 - P_2) / (n - 2) * (m - 2), m > 1. Тут может быть любая другая формула.
Пусть P_m = P_2 + (1 - P_2) / (n - 2) * (m - 2), m > 1. Тут может быть любая другая формула.
Также верно всё это.
Также суммарный шанс всех способностей равен 1 (100%), причём для предмета уровня m шанс для способностей уровня > m равен нулю. Соотношение шанса способности уровня i <= m и шанса способности уровня j < i одинаково для любого j и i и равно q > 1.
Итого имеем систему уравнений для предмета уровня m.
pm = P_m = P_2 + (1 - P_2) / (n - 2) * (m - 2) // задано
pm = p1 * q ^ (m - 1) // геометрическая прогрессия
1 = p1 + ... + pm = (p1 * q ^ m - p1) / (q - 1) // сумма m членов прогрессии
решение
pm / q ^ (m - 1) = p1
1 = p1 * (q ^ m - 1) / (q - 1)
pm / q ^ (m - 1) = p1
p1 = (q - 1) / (q ^ m - 1)
pm / q ^ (m - 1) = (q - 1) / (q ^ m - 1)
p1 = pm / q ^ (m - 1)
pm * q ^ m - pm = (q - 1) * q ^ (m - 1)
p1 = pm / q ^ (m - 1)
pm * q ^ m - pm = q ^ m - q ^ (m - 1)
p1 = pm / q ^ (m - 1)
pm = pm * q ^ m - q ^ m + q ^ (m - 1)
p1 = pm / q ^ (m - 1)
pm = q ^ m * (pm - 1) + q ^ (m - 1)
p1 = pm / q ^ (m - 1)
q ^ m * (pm - 1) + q ^ (m - 1) - pm = 0
p1 = pm / q ^ (m - 1)
Такое считать лучше не в варе, а тут.
Решения для P_2 = 0.5 и n = 8
Предмет уровня 1
- P_1 = 1
Предмет уровня 2
- P_2 = 0.5
- q = 1
Предмет уровня 3
- P_3 = 0.58
- q = 2.075
Предмет уровня 4
- P_4 = 0.67
- q = 2.92
Предмет уровня 5
- P_5 = 0.75
- q = 4
Предмет уровня 6
- P_6 = 0.83
- q = 6
Предмет уровня 7
- P_7 = 0.97
- q = 12
Предмет уровня 8
- P_8 = 1
globals
constant hashtable Hash = InitHashtable()
endglobals
library ItemAbility initializer init
globals
constant hashtable Hash = InitHashtable()
endglobals
struct AbilityLevelChances
static constant integer MaxItemLevel = 10
private static key ParentKey
readonly boolean edged
readonly integer itemid
readonly integer itemlevel
readonly integer abilid
readonly integer pm
readonly real q
static method create takes integer itemid, integer itemlevel, integer abilid, integer pm, real q returns thistype
local thistype this = allocate()
set .itemid = itemid
set .itemlevel = itemlevel
set .abilid = abilid
if itemlevel == 1 or itemlevel == MaxItemLevel then
set edged = true
set .pm = 100
set .q = 1.
else
set edged = false
set .pm = pm
set .q = q
endif
call SaveInteger(Hash, ParentKey, itemid, this)
return this
endmethod
method onDestroy takes nothing returns nothing
call RemoveSavedInteger(Hash, ParentKey, itemid)
endmethod
static method fromItemId takes integer id returns thistype
return LoadInteger(Hash, ParentKey, id)
endmethod
method getChance takes integer abillevel returns real
if abillevel > itemlevel or (abillevel < itemlevel and edged) then
return 0.
elseif abillevel == itemlevel then
if edged then
return 1.
endif
return pm
endif
return pm * Pow(q, abillevel - itemlevel)
endmethod
method getRandomLevel takes nothing returns integer
local real rv
local real max
local real min
local real p
local integer level = itemlevel
if edged then
return level
endif
set rv = GetRandomReal(0, 100)
set p = pm
set max = 100.
loop
set min = max - p
exitwhen level == 1 or (min < rv and rv <= max)
set level = level - 1
set p = p / q
set max = min
endloop
return level
endmethod
endstruct
private function init takes nothing returns nothing
call AbilityLevelChances.create( /*
*/ 'I000', /* item ID
*/ 5, /* item level
*/ 'A000', /* ability ID
*/ 75, /* P_5
*/ 4. /* q
*/ )
endfunction
endlibrary
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Borodach
y = 4
Itter = y
Должно возвращать при
x = 0 return 20
x = 1 return ~25
x = 2 return ~42
x = 3 return ~68
x = 4 return 100
Отредактирован PT153
Borodach:
Убывает в зависимости от того, сколько шагов от 0 к последнему. Или растет если шаг приближается к 0
Отредактирован PT153
Идея такая. Есть предметы уровня 1...n, и способности имеющие уровней 1...n(требубт мин уровень предмета).
При получении предмета, дается способность и уровень не может быть выше уровня предмета. Циклом от 0 до уровня предмета. В цыкле надо получить шанс установить уровень способности. Чем выше уровень предмета тем выше шанс получить способность равную уровню предмета.
Если предмет 8 уровня, то шанс 1ур. способности = 20 и все больше растет к 8 уровню. На 8 ур. шанс будет равен 100
Отредактирован PT153
Также суммарный шанс всех способностей равен 1 (100%), причём для предмета уровня m шанс для способностей уровня > m равен нулю. Соотношение шанса способности уровня i <= m и шанса способности уровня j < i одинаково для любого j и i и равно q > 1.
Отредактирован PT153
Пусть P_m = P_2 + (1 - P_2) / (n - 2) * (m - 2), m > 1. Тут может быть любая другая формула.