![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
| id | stars|
| 1 | 3 | | 2 | 5 | | 3 | 1 | | 4 | 7 | .................. |10 | 2 | Start меняется от 1 до 7 Как сделать вывод строк из базы в случайнем порядке, так чтоб вероятность вывода того у кого stars=7 было в 7 раз больше чем у stars=1... Единственное что приходит в голову - что-то типа получить большую цифру и посмотреть на что делится...... У кого есть идеи прошу не стесняйтесь, пишите любые варианты! |
|||
|
||||
awers |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1465 Регистрация: 22.3.2006 Где: Россия, Таганрог Репутация: 21 Всего: 31 |
это не в этот раздел
+order by random |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
от каждой строки в массив добавить столько идентификаторов, сколько звездочек. Выбирать случайно из массива
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
awers |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1465 Регистрация: 22.3.2006 Где: Россия, Таганрог Репутация: 21 Всего: 31 |
а .. это я немного непонял задачу.
|
|||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
В каком смысле идентификаторов? В базу 7 раз одно и тоже добавлять? Врят ли это имели ввиду! Мона поподробнее? |
|||
|
||||
bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
есть такая идея. stars - это коэффициент, вводим дополнительное поле - число показов (float! сейчас объясню).
далее делаем так - проводим выборку, где выбираем ту запись, которая имеет минимальное число показов, или случайную запись из минимального числа показов. выбрали и увеличиваем её количество показов на 1/stars. чем больше звёздочек, тем медленее будет расти число показов. чтобы избежать всплытия новых записей - при записи им надо присваивать среднее число по записям |
|||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
bars80080, идея хорошая но мне нужно немножко другое.
Эта схема хороша если нужно чтоб после после рефреша показывалась другая запись из формы. А мне нужно чтоб сразу создавался массив из всех записей базы, так чтоб вероятность того что на первом месте будет 7* было в 7 раз больше чем того что 0*. |
|||
|
||||
bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
тогда вариант ksnk, считываешь все записи, прогоняешь через цикл и множишь их в соответствии с количеством звёзд. потом случайная выборка или перестановка
|
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Если записей немного - select id,stars from table и строим массив
в котором столько Id'ов сколько старов. Из массива выбираем случайное значение. По id'у выбираем строчку таблицы Если значений в таблице дофига и строить массив по id'ам накладно - собираем статистику по количеству звездных записей - select count(*),stars from table group by stars ; получится что-то вроде с 1 звездой 1000, с 2-мя 200 с 3- мя 2029.... Каждое полученое число записей умножаем на количество звезд. После этого пропорционально, с округлением вверх, уменьшаем все эти числа, чтобы в сумме получилось "недофига". Мастерим массив в который укладываем количество звезд столько раз, сколько получилось. Случайно выбираем из массива какую звезду выбирать. Выбираем select * from table where stars=STAR order by rand() limit 1; -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
Записей немножко больше чем дофига.
Этот вариант не получится, потому что мне нужно получить id всех записей в вышеупомянутом порядке, а если каждый раз запрос отправлять серверу пипец. Если честно не понял идею, можно поподробнее? Проведем промежуточный итог: 1. Из базыне можем вибирать в случайном порядке с разными вероятностями 2. Единственным разумным подходом оказался умножить запись на количество * и потом случайно выбрать 3. Вопрос не так легко решился как я думал ![]() ------------------------ Такая идея возникла: Создаем массив 0=>1 1=>2 2=>2 3=>3 4=>3 5=>3 ....... Наши записи бросаем в массив, случайно выбираем элемент из первого массива и какое число получаем из второго массива вибыраем случайно элемент из тех у кого *= нашей выбранной. Это сообщение отредактировал(а) NNaarreekk - 9.11.2008, 11:38 |
|||
|
||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Мне казалось, что нужно получить одну строчку... Хотя несложно и модифицировать.
кстати, такую таблицу можно и сохранить, чтобы не пришлось ее сочинять очень часто Ну и результат
Сочинялось на коленке, ошибки могут быть... Это сообщение отредактировал(а) ksnk - 9.11.2008, 13:20 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
ksnk, спасибо большое!
Но это не будет тормозить работу сайта, если каждый раз при входе на страницу создавалась такая таблица? И причем каждый посетитель должен иметь свою собственную таблицу. Хотя можно чтоб скажем 20 минут показывалась одна и та же база а потом, при следующем входе изменялась..? |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Если данных мало - тормозить не будет, если много - будет. Можно, наверное, хранить таблицы некоторое время, если юзеров не очень много.
Вообще: практика - критерий истины. ![]() У меня, к примеру на локалке импорт неких данных занимает 10 секунд, на целевом хостинге - 10 минут, хотя они уверяют, что их машинка на порядок шустрее моей... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
Ладно будь что будет!
Еще раз спасибо всем кто помогал! |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
диапазон возможных значений определяется коэффициентом `stars`, потому, при равномерном распределении выроятности для rand() результат rand() * 7 в 7 раз вероятнее окажется больше, чем rand() * 1 |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
skyboy, Оппа!
![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
не понял. это как? можно поподробнее?
|
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
bars80080, возьмем прост RAND()
вероястность того, что возвращенное значение будет от 0 до 0,5 - составляет "0,5"(ну, если rand() возвращает значения только от 0 до 1). вероятность того, что возвращенное значение будет от 0 до 0,25 - составляет "0,25" вероятность того, что 8 * rand() будет больше, чем 1 составляет 7/8. верояность того. что 8 * rand() будет больше, чем 1 * rand() составляет 1/8(вероятность того, что 8 * rand() окажется меньше 1) * 1/2(вероястность того, что значене 8 * rand() окажется не только меньше порога в "1", но и меньше значения 1 * rand()) + 7/8(вероястность того, что 8*rand() будет больше 1, что всяко предел для выражения "1 * rand()") = 15/16. вероятность того, что 1 * rand() будет больше, чем 8 * rand() составляет 1/16. при сортировке это и есть вероястность "записи с одной звездой" стать "выше" записи с "восемью звездами". конечно, это не соотношение вероястностей равное соотношению звезд. но сравнимое. и средствами СУБД ведь если я правильно понял, топикстатртеру надо было не равномерное распределение вероятности, а линейнозависящее от параметра "stars" - чем больше звезд, тем больше вероятность быть отобранным. или я ошибся? Добавлено через 19 секунд что-то меня занесло ![]() |
|||
|
||||
bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
о-о-ой, я статистику автоматом получил, поэтому нифига в ней не варю
я не просёк, каким макаром число*rand() даёт нам вероятности. я думал что rand() возвращает всего лишь случайный идентификатор. что-то надо бы почитать о действии mysql с этой функцией... |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
rand() возвращает не идентификатор.
"случайный идентификатор" возвращает guid() rand() возвращает псевдослучайное число от 0 до 1(не включая) с равномернораспределенной вероятностью каждого числа из диапазона. т.е. вероятность возврата "0,75" равна(должна быть, но так как число - псевдослучайное, то вероятность не равномерно распределена, а имеет небольшие колебания, обусловленные многими факторами). топикстартеру нужна была функция, которая возвращала бы (псевдо)случайные числа с вероятностью, прямопропорциональной некоему парамтру(полю stars), чтоб потом по этим (псевдо)случайным значениям отсортировать. или как говорил сам автор:
|
|||
|
||||
bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 71 Всего: 315 |
![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
||||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
skyboy, ты может и будущее можешь предсказывать??
![]() Спасибо!! ![]() |
|||
|
||||
seos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 11.11.2008 Репутация: нет Всего: нет |
пробовал сделать.... неполучилось
![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
seos, "не получилось" - это как? ORDER BY rand() охаян за filesort, но вполне себе работает. ORDER BY rand() * `field` тоже работоспособно. так что?
NNaarreekk, если кратко, я считал соотношение вероятностей того, что запись с N звездами будет выше записи с K звездами, при том, что N> K. Так вот, ты хотел чтоб это соотношение вероятностей было линейно зависимо K/N: то есть чтоб вероятность выбора с 8 звездами была в 4 раза выше вероятности выбора с 4 звездами. То, что предложил я, по моим рассчетам дает соотношение 2*K/N - 1. Что немного отличается. |
|||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
||||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
||||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
Люде!!
Что-то не то получается!!!!! У кого звездочек меньше та показывается раньше, я конечно сменю последовательность так чтоб в базе у 5звездных записей писалось 1 и т.д. но хочется понять почему так произходит??? |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
ну, в твоем запросе сортировка по возрастанию. то есть, сначала те, у кого
|
|||
|
||||
NNaarreekk |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 768 Регистрация: 23.6.2007 Где: Армения Репутация: 0 Всего: 3 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |