Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Желательная случайность
 
 автор: halsoft   (13.10.2010 в 03:38)   письмо автору
 
 

Здравствуйте! Один знакомый попросил меня подумать над одной задачей:
у него есть таблица с пользователями и допустим в таблице есть столбец energy и это значение числовое, кратко говоря показывает оно активность пользователя - чем больше он добавляет сообщений, чем больше оставляет комментариев, тем больше у него energy
И нужно написать такой скрипт, который показывает этих пользователей по очереди в случайном порядке, но
если быть точнее не совсем в случайном - у кого больше energy, тот показывается чаще.

Подскажите, какими функциями в этом случае надо манипулировать?

  Ответить  
 
 автор: halsoft   (13.10.2010 в 14:54)   письмо автору
 
   для: halsoft   (13.10.2010 в 03:38)
 

Не понятна реакция - всем слабо или эта задача из ряда простых?

  Ответить  
 
 автор: psychomc   (13.10.2010 в 15:23)   письмо автору
 
   для: halsoft   (13.10.2010 в 14:54)
 

order by, rand()

  Ответить  
 
 автор: Trianon   (13.10.2010 в 15:32)   письмо автору
 
   для: psychomc   (13.10.2010 в 15:23)
 

второе всяко бесполезно.

  Ответить  
 
 автор: Trianon   (13.10.2010 в 15:35)   письмо автору
 
   для: halsoft   (13.10.2010 в 14:54)
 

ну вот мне, например, не нравится сама постановка задачи.
Не то что бы я не знал, с какой стороны к ней подходить, но влёт она браться не будет.
С другой стороны, если постановка вредная, а задача частная, и в моем понимании решенире ничего, кроме вреда не принесет, зачем тратить на него мозги?

  Ответить  
 
 автор: Balamut182   (13.10.2010 в 15:41)   письмо автору
 
   для: Trianon   (13.10.2010 в 15:35)
 

+1 так все-таки в случайном порядке показывать или по очереди по количеству энергии?
если в случайном - то ордер бай ранд ну и в условии может поставить среди юзверей с таким то минимальным количеством энергии
если по количеству энергии - ордер бай энерджи

  Ответить  
 
 автор: captain-america   (13.10.2010 в 15:51)   письмо автору
 
   для: Balamut182   (13.10.2010 в 15:41)
 

В запросе используй ORDER BY energy DESC LIMIT (сколько тут тебе надо их)
RAND() не трогай, затратная процедура для mysql.
Когда получишь массив на стороне пхп, сделай shuffle(массив) и будут они в случайной порядке

  Ответить  
 
 автор: halsoft   (14.10.2010 в 00:22)   письмо автору
 
   для: captain-america   (13.10.2010 в 15:51)
 

Спасибо, что уделили время. Но задача не просто отсориторовать по energy или показать отсортированных по energy в случайном порядке.

Постараюсь объяснить другими словами:

В общем, представьте себе такую страницу

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Ваня" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Вы обновляете страницу, выводится

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Коля" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Еще раз обновляете

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Ваня" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Ну и на всякий еще раз

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Здравствуйте! Пользователь "Толя" является одним из самых активных на нашем проекте.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Заметили? Ваня показался 2 раза, а Коля и Толя по одному разу - это потому что у Вани больше энергии. И представьте средне посещаемый сайт, много юзеров и там будет пользователь не по 1, 2 раза показываться, а за 1000, но надо учитывать что какие-то пользователи будут показываться меньше по частоте, а какие-то больше, всё зависит от этой energy.

Trianon, понимаю, мне тоже это не нравится, но привязались с просьбами, а я не знаю как это делать, точнее есть набросок в голове, но у него много недостатков. Я думал, может эта задача решается проще, чем я представляю в своей голове

  Ответить  
 
 автор: Николай2357   (14.10.2010 в 08:13)   письмо автору
 
   для: halsoft   (14.10.2010 в 00:22)
 

<?php
// Массив из базы, отсортированный по убыванию energy
    
$arr = array(
                  
'Ваня'
                  
'Коля',  
                  
'Толя',
                  
'Миша',
                  
'Саша',
                  
'Юра' ,
                  
'Дима',
                  
'Петя',
                  
'Дормидонд',
                  
'Махмуд'
                  
);


     
$arr array_merge($arrarray_slice($arr05));

     echo 
$arr[array_rand($arr)];
Считайте...

  Ответить  
 
 автор: sim5   (14.10.2010 в 08:55)   письмо автору
 
   для: Николай2357   (14.10.2010 в 08:13)
 

Это не решит задачи более частого повторение тех, чей ранг выше.

  Ответить  
 
 автор: Николай2357   (14.10.2010 в 10:54)   письмо автору
 
   для: sim5   (14.10.2010 в 08:55)
 

Разумеется это псевдослучайность. Но практика говорит о том, что всетаки они выскакивают чаще.
Другое дело, что в массиве может быть больше 10 элементов, это другой вопрос.
Принцип просто такой можно использовать. Входных условий явно недостаточно, чтобы написать полноценное решение.

  Ответить  
 
 автор: sim5   (14.10.2010 в 11:39)   письмо автору
 
   для: Николай2357   (14.10.2010 в 10:54)
 

Не обязательно чаще, это как повезет, может на несколько повторов выпадать шестерка, хотя она будет одна среди четырех тузов. ;-)

  Ответить  
 
 автор: halsoft   (15.10.2010 в 00:57)   письмо автору
 
   для: Николай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 у меня своя мода писать, так что сильно меня не судите за код ))

  Ответить  
 
 автор: Valick   (14.10.2010 в 12:09)   письмо автору
 
   для: halsoft   (13.10.2010 в 03:38)
 

1) сортируем в порядке убывания рейтинга
2) разбиваем например на три части 10/30/60 (=100 человек)
3) случайная выборка 2 человек из первой 10-ки
4) случайная выборка 3 человек из второй 30-ки
5) случайная выборка 5 человек из третей 60-ки
__
ну и различного рода вариации на тему... включайте фантазию

  Ответить  
 
 автор: halsoft   (15.10.2010 в 00:59)   письмо автору
 
   для: Valick   (14.10.2010 в 12:09)
 

Тоже хороший алгоритм, передам ;)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования