|
|
|
| Здравствуйте! Один знакомый попросил меня подумать над одной задачей:
у него есть таблица с пользователями и допустим в таблице есть столбец energy и это значение числовое, кратко говоря показывает оно активность пользователя - чем больше он добавляет сообщений, чем больше оставляет комментариев, тем больше у него energy
И нужно написать такой скрипт, который показывает этих пользователей по очереди в случайном порядке, но
если быть точнее не совсем в случайном - у кого больше energy, тот показывается чаще.
Подскажите, какими функциями в этом случае надо манипулировать? | |
|
|
|
|
|
|
|
для: halsoft
(13.10.2010 в 03:38)
| | Не понятна реакция - всем слабо или эта задача из ряда простых? | |
|
|
|
|
|
|
|
для: halsoft
(13.10.2010 в 14:54)
| | order by, rand() | |
|
|
|
|
|
|
|
для: psychomc
(13.10.2010 в 15:23)
| | второе всяко бесполезно. | |
|
|
|
|
|
|
|
для: halsoft
(13.10.2010 в 14:54)
| | ну вот мне, например, не нравится сама постановка задачи.
Не то что бы я не знал, с какой стороны к ней подходить, но влёт она браться не будет.
С другой стороны, если постановка вредная, а задача частная, и в моем понимании решенире ничего, кроме вреда не принесет, зачем тратить на него мозги? | |
|
|
|
|
|
|
|
для: Trianon
(13.10.2010 в 15:35)
| | +1 так все-таки в случайном порядке показывать или по очереди по количеству энергии?
если в случайном - то ордер бай ранд ну и в условии может поставить среди юзверей с таким то минимальным количеством энергии
если по количеству энергии - ордер бай энерджи | |
|
|
|
|
|
|
|
для: Balamut182
(13.10.2010 в 15:41)
| | В запросе используй ORDER BY energy DESC LIMIT (сколько тут тебе надо их)
RAND() не трогай, затратная процедура для mysql.
Когда получишь массив на стороне пхп, сделай shuffle(массив) и будут они в случайной порядке | |
|
|
|
|
|
|
|
для: captain-america
(13.10.2010 в 15:51)
| | Спасибо, что уделили время. Но задача не просто отсориторовать по energy или показать отсортированных по energy в случайном порядке.
Постараюсь объяснить другими словами:
В общем, представьте себе такую страницу
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Ваня" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Вы обновляете страницу, выводится
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Коля" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Еще раз обновляете
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Ваня" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ну и на всякий еще раз
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Толя" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Заметили? Ваня показался 2 раза, а Коля и Толя по одному разу - это потому что у Вани больше энергии. И представьте средне посещаемый сайт, много юзеров и там будет пользователь не по 1, 2 раза показываться, а за 1000, но надо учитывать что какие-то пользователи будут показываться меньше по частоте, а какие-то больше, всё зависит от этой energy.
Trianon, понимаю, мне тоже это не нравится, но привязались с просьбами, а я не знаю как это делать, точнее есть набросок в голове, но у него много недостатков. Я думал, может эта задача решается проще, чем я представляю в своей голове | |
|
|
|
|
|
|
|
для: halsoft
(14.10.2010 в 00:22)
| |
<?php
// Массив из базы, отсортированный по убыванию energy
$arr = array(
'Ваня',
'Коля',
'Толя',
'Миша',
'Саша',
'Юра' ,
'Дима',
'Петя',
'Дормидонд',
'Махмуд'
);
$arr = array_merge($arr, array_slice($arr, 0, 5));
echo $arr[array_rand($arr)];
| Считайте... | |
|
|
|
|
|
|
|
для: Николай2357
(14.10.2010 в 08:13)
| | Это не решит задачи более частого повторение тех, чей ранг выше. | |
|
|
|
|
|
|
|
для: sim5
(14.10.2010 в 08:55)
| | Разумеется это псевдослучайность. Но практика говорит о том, что всетаки они выскакивают чаще.
Другое дело, что в массиве может быть больше 10 элементов, это другой вопрос.
Принцип просто такой можно использовать. Входных условий явно недостаточно, чтобы написать полноценное решение. | |
|
|
|
|
|
|
|
для: Николай2357
(14.10.2010 в 10:54)
| | Не обязательно чаще, это как повезет, может на несколько повторов выпадать шестерка, хотя она будет одна среди четырех тузов. ;-) | |
|
|
|
|
|
|
|
для: Николай2357
(14.10.2010 в 08:13)
| | В данном случае у первых пяти особей будут равные шансы, но надо чтоб эти шансы были по убыванию :)
У меня был следующий алгоритм:
В начале нового дня (то есть с 00.00) очищаем у всех юзеров поле shows (ниже написано, для чего оно) посчитаем всё количество энергии у всех пользователей - total (представим оно равняется 30000), далее найдём пользователя, у которого максимальное количество энергии (примерно 5000) и выясним какая у него доля - max/total*100 или 5000/30000*100 = 16,66
Грубо говоря, пользователь, у которого все 100 процентов энергии, в течение 24 часов может показаться 86400 раз (если показать каждую секунду).
Посчитаем, сколько покажется max 16,66*86400/100= 14394 округленно
Это значение записываем в базу пользователя, назовём столбец shows, очищаем поле Energy у данного пользователя
Всё вышеизложенное можно забить в крон, чтоб он автоматически в 00.00 делал.
Дальше мы уже имеем человека, чтоб выводить и с каждым показом у него будет уменьшаться поле shows.
Что делаем дальше? Ведь остались еще те, поле shows которых не заполено. А заполнять мы будем его у них по следующей схеме - после выполнения крон задачи, каждый пользователь сам и заполнит себе это поле, автоматически, то есть он обновит страницу и скрипт сам посмотрит сколько у него энергии и определит shows, затем очистит поле Energy и так у всех постепенно, по мере их активизации.
Получится, что к середине дня почти у всех будет заполнено shows (всех активных, обладающих хоть какой энергией) и получится, что все будут потихоньку набирать энергию сначала, но при этом тратя уже заработанную день раньше, теперь уже переведённую в shows.
Главный вопрос - каким образом они будут тратить энергию, как будут выводиться на странице? Смог придумать только следующее
<?
$users = mysql_query("select name from users where shows != '0' ");
$count = mysql_num_rows($users);
$rand = rand(0,$count-1);
$rand2 = $rand+1;
$users = mysql_query("select name,shows from users where shows !='0' order by shows desc limit $rand,$rand2");
$users = mysql_fetch_array($users);
mysql_query("update users set shows = '".($users[shows]-1)."' where name = '$users[name]' ");
print "Здравствуйте! Пользователь \"$users[name]\" является одним из самых активных на нашем проекте.";
?>
|
В общем, получается не то, что хотелось бы, но показы будут справедливыми и никого в обиде не оставят. Кстати, вместо 86400 можно подставить среднее количество хитов за день на страницу скрипта.
На PHP у меня своя мода писать, так что сильно меня не судите за код )) | |
|
|
|
|
|
|
|
для: halsoft
(13.10.2010 в 03:38)
| | 1) сортируем в порядке убывания рейтинга
2) разбиваем например на три части 10/30/60 (=100 человек)
3) случайная выборка 2 человек из первой 10-ки
4) случайная выборка 3 человек из второй 30-ки
5) случайная выборка 5 человек из третей 60-ки
__
ну и различного рода вариации на тему... включайте фантазию | |
|
|
|
|
|
|
|
для: Valick
(14.10.2010 в 12:09)
| | Тоже хороший алгоритм, передам ;) | |
|
|
|