Формула дропа

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

для рядового юзера главное что работает :D а каким методом сделан костыль никого не интересует. Яйциент стайл мазафака.
Пост вообще не по теме и причём тут этот яичник. Тема как раз о том как сделать правильную работу, не правильно оно изначально сделано, кем то.
 
вобще, сумма всех шансов предметов в группе всегда должна быть ровно 100%. манипулирование рейтами на дроп должно затрагивать всегда только шанс самой группы, но никак не шансы вещей внутри этой группы - у вещей в ней максимум может повышаться количество, в случаях когда уже сам шанс группы дошел до 100% и выше подниматься не может.

про сам расчет выпадения определенной вещи из группы, если по простому и тупому:
100% в ней растягиваются как к примеру диапазон чисел от 0 до 1кк, т.е. к примеру 1% в группе равен 10000 единиц.
в группе у нас например 5 вещей, каждый с шансом 20%, т.е. 200000 единиц.
при выпадении группы кидается Rnd.get(1000000).
к примеру выпало 250000.
начинаем перебор вещей в группе, суммируя при этом их шансы и проверяя при этом - не вписывается ли выпавшее число в диапазон сумма для предыдущей вещи - сумма для текущей вещи, т.е.:
1 - 0 - 200000
2 - 200000 - 400000
3 - 400000 - 600000
...

и вот в данном случае выпадет вторая вещь, т.к. 250000 входит в диапазон 200000 - 400000.

надеюсь более менее понятно объяснил :)
Rnd.get(1000000) это типо 100%
Выпадает число например 450000
И какой итем в такой ситуации выпадет?
<group chance="0.0669">
<!-- Icarus Accipiter-->
<reward item_id="10223" min="1" max="1" chance="3.91" /> 39100 единиц
<!-- Sealed Destino Boots-->
<reward item_id="15706" min="1" max="1" chance="72.0682" /> 720682 единиц
<!-- Sealed Destino Jaket-->
<reward item_id="15699" min="1" max="1" chance="24.0218" /> 240218 единиц
</group>
на таком примере можешь показать? чтобы точно дошло)
 
Код:
itemId 57 cont 30434 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) true chance 37215 (i.getChanceInGroup() - i.getChance())
0.0  i.getChanceInGroup() 1000000.0 i.getChance() 1000000.0
drop2 57
itemId 1894 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) true chance 122899 (i.getChanceInGroup() - i.getChance())
0.0  i.getChanceInGroup() 266033.0 i.getChance() 266033.0
drop2 1894
itemId 4039 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance())
 266033.0  i.getChanceInGroup() 518764.0 i.getChance() 252731.0
itemId 4041 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance())
 518764.0  i.getChanceInGroup() 584694.0 i.getChance() 65930.0
itemId 4044 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance())
 584694.0  i.getChanceInGroup() 837425.0 i.getChance() 252731.0
itemId 10483 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance()
) 837425.0  i.getChanceInGroup() 890077.0 i.getChance() 52652.0
itemId 10484 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance()
) 890077.0  i.getChanceInGroup() 903240.0 i.getChance() 13163.0
itemId 10485 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance()
) 903240.0  i.getChanceInGroup() 904556.0 i.getChance() 1316.0
itemId 9546 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance())
 904556.0  i.getChanceInGroup() 965211.0 i.getChance() 60655.0
itemId 17248 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance()
) 965211.0  i.getChanceInGroup() 969671.0 i.getChance() 4460.0
itemId 6622 cont 1 chance < i.getChanceInGroup() true (chance > i.getChanceInGroup() - i.getChance()) false chance 122899 (i.getChanceInGroup() - i.getChance())
 969671.0  i.getChanceInGroup() 1000000.0 i.getChance() 30329.0
Код:
<rewardlist type="RATED_GROUPED">
            <group chance="66">
                <!-- Adena-->
                <reward item_id="57" min="13033" max="30434" chance="100" />
            </group>
            <group chance="0.0669">
                <!-- Icarus Accipiter-->
                <reward item_id="10223" min="1" max="1" chance="3.91" />
                <!-- Sealed Destino Boots-->
                <reward item_id="15706" min="1" max="1" chance="72.0682" />
                <!-- Sealed Destino Jaket-->
                <reward item_id="15699" min="1" max="1" chance="24.0218" />
            </group>
            <group chance="80.2986">
                <!-- Crafted Leather-->
                <reward item_id="1894" min="1" max="1" chance="26.6033" />
                <!-- Mold Glue-->
                <reward item_id="4039" min="1" max="1" chance="25.2731" />
                <!-- Mold Hardener-->
                <reward item_id="4041" min="1" max="1" chance="6.593" />
                <!-- Thons-->
                <reward item_id="4044" min="1" max="1" chance="25.2731" />
                <!-- General 82 S-->
                <reward item_id="10483" min="1" max="1" chance="5.2652" />
                <!-- Special 82 S-->
                <reward item_id="10484" min="1" max="1" chance="1.3163" />
                <!-- Rare 82 S-->
                <reward item_id="10485" min="1" max="1" chance="0.1316" />
                <!-- Ore Of Fire-->
                <reward item_id="9546" min="1" max="1" chance="6.0655" />
                <!-- Big Dragon Bone Summon-->
                <reward item_id="17248" min="1" max="1" chance="0.446" />
                <!-- Codex Of Giant-->
                <reward item_id="6622" min="1" max="1" chance="3.0329" />
            </group>
        </rewardlist>
Так получается?
И вот тут есть 2 предмета с одинаковым шансом, что будет если попадёт в их диапозон? какой из 2 предметов выпадет?
@Gaikotsu
 
Последнее редактирование:
В чем проблема посмотреть любую сборку ? Там все просто до невозможности. Шанс высчитывается сразу, затем в цикле перебираются итемы и суммируются их шансы пока не попадут в тот шанс, что был высчитан заранее. Такая логика, наверное, в каждой сборке с небольшими изменениями для рейтовки.

Что-то типо того ("псевдокод"):
PHP:
double chance = Rnd.get(100.0D); // Сумма шансов
double totalChance = 0.0D;

for (Item item : items)
{
         totalChance += item.getChance();
         if (totalChance >= chance)
                return item;
}

Сумма шансов всегда должна быть 100%.
С кодом выше может выпасть только 1 предмет из группы.

P.S. Писал с телефона, возможны ошибки.
 
Собственно говоря qwerty123 уже все сказал.
 
Назад
Сверху Снизу