Случайный взвешенный выбор события

Возможный дубликат:
Создание случайных результатов по весу в PHP?

Я создал базу данных, в которой я храню имя и ссылку rss-каналов. Я сделал rss-ридер, и все в порядке до сих пор. Я хочу сделать скроллер новостей, который покажет статьи из фидов. Но я хочу чтобы дать кормам некоторые значения веса, чтобы каждый канал был выбран в соответствии с его значением для меня, и автоматически, когда канал выбран из тех, что указаны в базе данных, его статьи будут отображаться только в скроллере. Все идеи о том, как я могу это сделать что ??? Спасибо заранее ..

ps Моя проблема заключается в том, как я могу сделать aytomatically случайный взвешенный выбор фидов из базы данных, а не как показать статьи в фидах (я сделал эту часть).

Solutions Collecting From Web of "Случайный взвешенный выбор события"

Два способа сделать это, о чем я могу думать из головы:

Вариант 1: Заполните новый массив ключевыми значениями из набора данных, где вес определяет, как часто повторяется элемент. Затем пропорция в этом массиве соответствует взвешенному распределению. Просто возьмите с помощью $arr[array_rand($arr)] . Хотя это просто и легко понять, это будет взрываться в вашем лице, если есть много предметов или если значения веса действительно высоки.

 $weighted = array(); foreach($items as $item) { array_merge($weighted, array_fill(0, $item['weight'], $item['value']); } $result = $weighted[array_rand($weighted)]; 

Вариант 2. Суммируйте вес. Выберите случайное число между 0 и суммой весов. Перебирайте элементы в наборе данных, сравните их с выбранным случайным числом. Как только вы нажмете тот, который равен или больше, чем случайный индекс, выберите этот элемент.

 function findRandomWeighted(array $input) { $weight = 0; // I'm assuming you can get the weight from MySQL as well, so this loop really should not be required. In that case $weight becomes a parameter. foreach($items as $item) { $weight += $item['weight']; } $index = rand(1, $weight); foreach($items as $item) { $index -= $item['weight']; if($index <= 0) { return $item['value'] } } return null; } 

После нашего разговора в комментариях ниже, вот Pastebin с кодом в нем:

http://pastebin.com/bLbhThhj

Вы можете найти быстрый алгоритм, реализованный и описанный – взвешенный случайный (в javascript, но может быть переписан на PHP за несколько минут, я думаю). Это намного быстрее, чем цикл через массив.