Задать вопрос
@outplayedrq

Как реализовать шанс дропа на JavaScript?

Есть некая переменная, полученная из базы данных в которой содержится массив с шансом дропа. chance[]. Массив соответствует id. В массив шанс дропа идёт от 1 до 100.
Вещь 1 = 70
Вещь 2 = 30
Вещь 3 = 5
Нужно написать логику, как это можно реализовать. Вещей много и каждой прописывать if else это совсем не то. Допустим падает число от 0 до 70, падает вещь 1 - вот и получили вероятность выпадения. Но как реализовать это в коде. Весь код, который получилось набросать, я если честно даже не могу сообразить, как это реализовать.. Получилось вот что, минимальное - максимально значение соответствует кол-ву предметов, и обычным рандомом выводится любая вещь. Без учёта шанса и тд.

Игровая механика: Шанс дропа определенной вещи — как? - Смотрел эту статью. Суть мне ясна, но как это реализовать, я не понимаю.

function RandomInt( ) {
    const min = 0;
    const max = 28;
    const Roll = Math.floor(Math.random() * (max - min + 1) + min);
    const Roulet =
       `ID ${id[Roll]} <br>
        Title ${title[Roll]} <br>
        Img ${img[Roll]} <br>
        Price ${price[Roll]} <br>
        Type ${type[Roll]} <br>
        Chance ${chance[Roll]} <br>`;
    return Roulet;
}
  • Вопрос задан
  • 3685 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
const items = [
    {
        name: 'Apple',
        dropChance: 0.7
    },
    {
        name: 'Knife',
        dropChance: 0.25
    },
    {
        name: 'Spoon',
        dropChance: 0.25
    },
    {
        name: 'Ice Cream',
        dropChance: 0.1
    }
];

const lerp = (min, max, value) => ((1 - value) * min + value * max);

const drop = items => {
    const total = items.reduce((accumulator, item) => (accumulator + item.dropChance), 0);
    const chance = lerp(0, total, Math.random());

    let current = 0;
    for (const item of items) {
        if (current <= chance && chance < current + item.dropChance) {
            return item;
        }

        current += item.dropChance;
    }
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы