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

Есть массив:
var items = [
	{
		name: 'X2',
		dropChance: 0.33 // Шанс
	},
	{
		name: 'X3',
		dropChance: 0.33
	},
	{
		name: 'X5',
		dropChance: 0.33
	},
	{
		name: 'X20',
		dropChance: 0.33
	}
];


Нужно чтобы функция возвращала сам элемент, и с каким шансом выпал этот элемент.

В интернете что-то находил, но это не то
  • Вопрос задан
  • 312 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Надо сложить все шансы и получить максимум. От 0 до этого максимума берётся случайное.

Идти по массиву, накапливая сумму шансов.
Как только сумма перевалит через полученное случайное — вот он наш элемент.
function getByChance(items) {
  const totalChances = items.reduce((acc, c) => acc + c.dropChance, 0);
  const rnd = totalChances * Math.random();

  for (let i = 0, sum = 0;; i++) {
    sum += items[i].dropChance;
    if (sum > rnd) return items[i];
  }
}

getByChance(items) // вернёт один из объектов массива
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
pLavrenov
@pLavrenov
Разработка сайтов
Ваш ответ на вопрос

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

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