@anubis465

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

Хочется сделать игрового бота, но как-то не получается. Мне нужно сделать так, что бы при написании команды бот отправлял определенное сообщение с шансом. Допустим у нас есть 4 предмета:
1 предмет с шансом 30 %
2 предмет с шансом 40 %
3 предмет с шансом 50 %
4 предмет с шансом 60 %
Бот должен отправить сообщение в соответствии шансу. Искал уже вопрос по данной теме и нашёл код :
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;
    }
};
  • Вопрос задан
  • 1750 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
Знакомый код. Ну а в чем проблема то?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Karpion
Простите, а почему у Вас сумма процентов = 180% ? Чуров, перелогиньтесь!

Если проценты круглые, то можно примерно так:
Делаем массив {1,1,1,2,2,2,2,3,3,4}. Делаем случайное целое число от 0 до 9 (берём float случайное число от 0 до 1, умножаем на 10, берём целую часть с округлением вниз). Используем это число как индекс в массиве, получаем номер выпавшего предмета.

Если проценты не круглые, то делаем float случайное число от 0 до 1. Потом по очереди отнимаем от него проценты вероятности выпадения предметов, пока не станет <=0 .

Если предметов очень много - то в массив записываем не сами вероятности, а сумму предшествующих вероятностей - и ищем методом половинного деления. Мне лень расписывать - но по отдельной просьбе могу набросать пример.
Ответ написан
@bqio
https://bqio.github.io/
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы