"ранжирование", выдача с определенной вероятностью...

vg2k

Новичок
"ранжирование", выдача с определенной вероятностью...

Есть массив:

Код:
$a = array(
0 => array('id' => 1, 'rating' => 50),
1 => array('id' => 2, 'rating' => 320),
2 => array('id' => 3, 'rating' => 180),
3 => array('id' => 4, 'rating' => 530)
);
как можно реализовать случайную выдачу одного из элементов $a, причем вероятность выдачи $a[3] значительно больше нежели $a[0] т.к. ретинг выше...

PS. к мелочам оформления не придирайтесь, пожалуйста. Не предлагайте id из подмассива вынести в сам $a ;)
 

SiMM

Новичок
Просуммировать рейтинги (в данном случае получим 1080), выбрать случайное число из диапазона от 0 до рейтинг-1 (0-1079), затем перебором массива определить, в какой интервал мы попали (id=1 => интервал 0-49, id=2 => 50-369, id=3 => 370-549, id=4 => 550-1079).
 

vg2k

Новичок
SiMM, спасибо наверное такая реализация самая оптимальная. А то я, как вариант, хотел диапахон представлять в процентах и случайно срасывать от 1 до 100, однако при кучи элементов... прейдеться в дробные капаться.

А как бы включить возможность выдачи с рейтингом 0 ? только исскуственно увеличивать рейтинг ?
 

SiMM

Новичок
Элемент с рейтингом 0 (по теории вероятности, если я ещё что-то в ней понимаю) никогда не может быть выбран. Либо так и должно быть, либо условия задачи выданы в форум неполностью.
 

bgm

 
А если есть элементы, у которых одинаковый рейтинг?
 

SiMM

Новичок
> А если есть элементы, у которых одинаковый рейтинг?
И? Вероятность их выбора будет одинакова.
 

vg2k

Новичок
SiMM давай представим, что это новостная лента... или нет, лучше блог. Автор с рейтингом 0 не будет выводиться никогда на главной в миниобзорах, значит вероятность посетителя попасть на его страницу очень мала... а кто же, как ни посетитель поднимет рейтинг. Это лишь пример.
Вообщем как самый простой вариант выбора с учетом нулевых рейтингов, наверное, давать им(элементам с нулевым рейтингом) фору на N-ую сумму при поиске рэндомного элемента.
 

vg2k

Новичок
Clubber спасиб за столь подробную инструкцию. ;) Меня больше сам алгоритм т.е. способ интересовал. Да и фору тогда буду давать уже в процентом отношении от общей суммы рейтингов.
 

Мутник

Новичок
vg2k

Simm во втором посте тебе красиво все ответил. Это будетсамым быстрым вариантом в твоем случае.. А если рейтинг нулевой -то делай с ним то, что сам хочешь.
 

vg2k

Новичок
Мутник да ответ я уже получил сразу. Но ведь топик не закрыт, все постят и я постю.... все кинуться с крыши и я кинусь ;)
 

SiMM

Новичок
> SiMM давай представим, что это новостная лента... или нет, лучше блог. Автор с рейтингом 0 не будет выводиться никогда на главной в миниобзорах, значит вероятность посетителя попасть на его страницу очень мала... а кто же, как ни посетитель поднимет рейтинг. Это лишь пример.

Разумнее авторам по умолчанию давать рейтинг не 0, а 1. Если тебя это смущает - сей факт ты можешь скрыть от посетителей, вычитая единицу из рейтинга автора при выводе.
 

bgm

 
Единственное, что смущает в этом элегантном алгоритме, что если случайное число попадает в последний интервал, то придётся перебрать все предыдущие. Поэтому, может быть, имеет смысл применять бинарный поиск интервала.
 

SiMM

Новичок
По поводу оптимизации - дерево Хаффмана - наименее вероятные листья ниже более вероятных ;)
 
Сверху