meta.stackexchange.com/q/8259

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

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

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

Ответы на вопрос(2)

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

 Peter O.20 окт. 2012 г., 07:32
Вы не должны просто давать ссылку на другой сайт в качестве ответа, так как сайт может устареть в будущем. Вместо этого нажмите ссылку «изменить» в этом ответе и включите основные части решения с этой страницы здесь. Видеть:meta.stackexchange.com/q/8259
Решение Вопроса

Вариант 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

 kander07 янв. 2011 г., 19:27
Привет, user566487 - что делает первый пример: если у вас есть такой массив$feeds = array(array('value'=>'Feed 1', 'weight'=>2), array('value'=>'Feed 2', 'weight'=>1), array('value'=>'Feed 3', 'weight'=>5)), он создает вторичный массив как:array('Feed 1', 'Feed 1', 'Feed 2', 'Feed 3', 'Feed 3', 'Feed 3', 'Feed 3', 'Feed 3'); Каждый элемент вставляется так часто, как показывает его вес. Затем вы можете просто вытянуть случайную единицу, используя array_rand (), и она будет случайной в соответствии с указанными вами весами. Но если вы думаете, что второй проще, пожалуйста, используйте его как лучше :)
 olaf3607 янв. 2011 г., 07:50
Нет, в базе данных не будет много записей. 10 каналов максимум ... БД имеет только 3 поля. Идентификатор, имя канала, URL канала. Если честно, я не понимаю первое решение, которое вы дали мне так много. Я попробую второй в качестве первого подхода .. Я не профессионал в php, и это выглядит проще для меня .. Спасибо!
 ughoavgfhw07 янв. 2011 г., 07:38
+1 Второй вариант, вероятно, будет быстрее и, возможно, проще в реализации.
 olaf3610 янв. 2011 г., 11:45
Кроме того, эффективно ли добавить еще одно поле в базе данных с весом и добавить значения. Но опять же я не знаю, как их объединить
 olaf3610 янв. 2011 г., 11:41
Извините, мой друг, но я слишком запутался. Я не знаю, как заставить скрипт брать канал из моей базы данных. Конечно, с выражением, подобным SELECT * from feeds, где feed_id = переменная, которая производит случайное взвешенное значение. Но я я не знаком с идеей случайного взвешенного значения. Я имею в виду, что я не знаю, как объединить предложенную вами идею с моей базой данных.

Ваш ответ на вопрос