alexbuki
@alexbuki
программист js

Как выбрать случайный элемент из списка с учётом его веса?

Добрый день.
Засела в голове одна задачка с собеса.
Заранее прощу прощения за не совсем точно сформулированные условия, но суть примерно такая:
Есть массив рекламодателей.
[
{data: {...}, w: 5},
{data: {...}, w: 1000}
{data: {...}, w: 3}
]

Где data -это инфа которую нужно разместить на рекламном баннере на вашем сайте, а w - это "вес" этого рекламодателя, грубо говоря сумма, которую он заплатил.
Необходимо написать алгоритм, который случайным образом будет выбирать рекламодателя , но при этом частота попадания должна зависеть от "веса" - w.
То есть если w = 1000, то баннер должен показываться чаще, чем у рекламодателей с меньшим w.
  • Вопрос задан
  • 648 просмотров
Решения вопроса 1
@Picknice
Веб-программист (FULL STACK)
Можно такой подход. Интересно критику почитать.
var banners = [];
// Генерируем тестовый массив баннеров
for( var i = 1; i <= 5; i++ ){
	banners.push( {
		data: i,
		w: Math.floor( Math.random() * 1000 ) + 1 // Вес баннера от 1 до 1000 к примеру
	} );
}
console.log(banners);
var wt = 0; // Сумма веса всех баннеров
for( var i = 0; i < banners.length; i++ ){
	var banner = banners[i];
	banner.bound = wt += banner.w; // Определяем границу, которая зависит от веса
}
console.log(banners); // Проверить наглядно какие границы созданы
// Генерируем число от 0 до wt
var r = Math.floor( Math.random() * wt + 1 );
for( var i = 0; i < banners.length; i++ ){
	// Ищем какой баннер попал в полученное случайное число
	var banner = banners[i];
	if( r > banner.bound - banner.w && r < banner.bound ){
		console.log('banner ' + banner.data); // В итоге при таком подходе вероятность выпадения более ценного баннера выше, главное чтоб вес был > 0, иначе баннер найден неправильно.
	}	
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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