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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

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

можно стоимость убрать и триггерами начислять/убавлять

28
Добавь статическую переменную в функцию, её и возвращай
Этот комментарий удален
18
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
28
На графике я вижу, что функция убывает.
Borodach:
x = 0 return 20
x = 1 return ~25
x = 2 return ~42
x = 3 return ~68
x = 4 return 100
А здесь возрастает

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

В принципе диаграму можно построить с возрастанием. Изобразил первое что пришло в голову
28
то есть х=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
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.