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. Тут может быть любая другая формула.
Также верно всё это.
Также суммарный шанс всех способностей равен 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
0
13
3 года назад
Отредактирован Borodach
0
rsfghd, а как получить нужное число по формуле, именно в этом вопрос

К примеру:
y = 4
Itter = y
Должно возвращать при
x = 0 return 20
x = 1 return ~25
x = 2 return ~42
x = 3 return ~68
x = 4 return 100
0
28
3 года назад
Отредактирован PT153
0
На графике я вижу, что функция убывает.
Borodach:
x = 0 return 20
x = 1 return ~25
x = 2 return ~42
x = 3 return ~68
x = 4 return 100
А здесь возрастает

Так что я не понимаю, какую формулу хочет автор.
0
13
3 года назад
0
PT153, в функции в вопросе у-х, то есть х=0 будет 4-0=4, 5 иттераций из 5, до значения в 100. Если х=1 то 4-1=3, осталось 4 иттерации из 5 до значения 100.
Убывает в зависимости от того, сколько шагов от 0 к последнему. Или растет если шаг приближается к 0

В принципе диаграму можно построить с возрастанием. Изобразил первое что пришло в голову
0
28
3 года назад
Отредактирован PT153
0
то есть х=0 будет 4-0=4
Откуда 4, если дан только x?

constant int min = 20
constant int max = 100
constant int iterations = 5
constant real Q = Pow(max / min, 1 / (iterations - 1))

function  some takes int x, int y returns int
	return R2I(min * Pow(Q, y - x) + 0.5)
endfunction
0
13
3 года назад
0
PT153, я к примеру приводил, если в функцию на х будет передаваться значение 0.
Идея такая. Есть предметы уровня 1...n, и способности имеющие уровней 1...n(требубт мин уровень предмета).
При получении предмета, дается способность и уровень не может быть выше уровня предмета. Циклом от 0 до уровня предмета. В цыкле надо получить шанс установить уровень способности. Чем выше уровень предмета тем выше шанс получить способность равную уровню предмета.
Если предмет 8 уровня, то шанс 1ур. способности = 20 и все больше растет к 8 уровню. На 8 ур. шанс будет равен 100

Спасибо, дома проверю.
2
28
3 года назад
Отредактирован PT153
2
Пусть есть число maxmin_ratio - соотношение между максимальным и минимальным шансом.
Также суммарный шанс всех способностей равен 1 (100%), причём для предмета уровня m шанс для способностей уровня > m равен нулю. Соотношение шанса способности уровня i <= m и шанса способности уровня j < i одинаково для любого j и i и равно q > 1.
Итого имеем систему уравнений для предмета уровня m.
pm / p1 = maxmin_ratio  // задано
pm = p1 * q ^ (m - 1)  // геометрическая прогрессия
1 = p1 + ... + pm = (p1 * q ^ m - p1) / (q - 1)  // сумма m членов прогрессии
решение
pm / p1 = maxmin_ratio
pm / p1 = q ^ (m - 1)
1 = p1 * (q ^ m - 1) / (q - 1)
maxmin_ratio = q ^ (m - 1)
pm = p1 * q ^ (m - 1)
1 = p1 * (q ^ m - 1) / (q - 1)
q = maxmin_ratio ^ (1 / (m - 1))
pm = p1 * q ^ (m - 1)
1 = p1 * (q ^ m - 1) / (q - 1)
q = maxmin_ratio ^ (1 / (m - 1))
pm = p1 * q ^ (m - 1)
p1 = (q - 1) / (q ^ m - 1)
q = maxmin_ratio ^ (1 / (m - 1))
pm = p1 * q ^ (m - 1)
p1 = (q - 1) / (maxmin_ratio * q - 1)
globals
    constant hashtable Hash = InitHashtable()
endglobals

library ItemAbility initializer init
struct ItemAbilityInfo
    private static key ParentKey

    readonly integer itemid
    readonly integer abilid
    readonly real maxmin_ratio
    
    static method create takes integer itemid, integer abilid, real maxmin_ratio returns thistype
        local thistype this = allocate()
        set .itemid = itemid
        set .abilid = abilid
        set .maxmin_ratio = maxmin_ratio

        call SaveInteger(Hash, ParentKey, itemid, this)
        call SaveInteger(Hash, ParentKey, abilid, this)

        return this
    endmethod

    static method fromObjectId takes integer id returns thistype
        return LoadInteger(Hash, ParentKey, id)
    endmethod

    method getAbilityLevelChance takes integer itemlevel, integer abillevel returns real
        local real q

        if abillevel > itemlevel then
            return 0.
        endif
        if itemlevel == 1 then
            return 1.
        endif

        set q = Pow(maxmin_ratio, 1 / (itemlevel - 1))
        return (q - 1) / (maxmin_ratio * q - 1) * Pow(q, abillevel - 1)
    endmethod
endstruct

private function init takes nothing returns nothing
    call ItemAbility.create( /*
        */ 'I000', /*  item ID
        */ 'A000', /*  ability ID
        */ 1.5 /*  max_p / min_p
        */ )
endfunction

endlibrary

В примере выше, чем больше уровень предмета, тем меньше шанс выпадения способности его уровня.
Предмет уровня 1
  • шанс выпадения способности уровня 1 - 100%
Предмет уровня 2
  • шанс выпадения способности уровня 1 - 40%
  • шанс выпадения способности уровня 2 - 60%
Предмет уровня 3
  • шанс выпадения способности уровня 1 - 27%
  • шанс выпадения способности уровня 2 - 33%
  • шанс выпадения способности уровня 2 - 40%
И так далее.
2
28
3 года назад
Отредактирован PT153
2
А вот сейчас будет пример, где чем больше уровень предмета, тем выше шанс выпадения способности его уровня.
Пусть для каждого предмета уровня 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. Тут может быть любая другая формула.
Также верно всё это.
Также суммарный шанс всех способностей равен 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
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.