Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм вывода случайных чисел 
V
    Опции темы
NNaarreekk
Дата 7.11.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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...

Единственное что приходит в голову - что-то типа получить большую  цифру и посмотреть на что делится......

У кого есть идеи прошу не стесняйтесь, пишите любые варианты!
PM MAIL WWW   Вверх
awers
Дата 7.11.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



это не в этот раздел
+order by random
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 7.11.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



от каждой строки в массив добавить столько идентификаторов, сколько звездочек. Выбирать случайно из массива


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
awers
Дата 7.11.2008, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



а .. это я немного непонял задачу.
PM MAIL WWW ICQ Skype   Вверх
NNaarreekk
Дата 9.11.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Цитата(ksnk @  7.11.2008,  23:15 Найти цитируемый пост)
столько идентификаторов, сколько звездочек


В каком смысле идентификаторов?
В базу 7 раз одно и тоже добавлять? Врят ли это имели ввиду!

Мона поподробнее?
PM MAIL WWW   Вверх
bars80080
Дата 9.11.2008, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



есть такая идея. stars - это коэффициент, вводим дополнительное поле - число показов (float! сейчас объясню).
далее делаем так - проводим выборку, где выбираем ту запись, которая имеет минимальное число показов, или случайную запись из минимального числа показов. выбрали и увеличиваем её количество показов на 1/stars. чем больше звёздочек, тем медленее будет расти число показов.
чтобы избежать всплытия новых записей - при записи им надо присваивать среднее число по записям
PM MAIL WWW   Вверх
NNaarreekk
Дата 9.11.2008, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



bars80080, идея хорошая но мне нужно немножко другое.

Эта схема хороша если нужно чтоб после после рефреша показывалась другая запись из формы.

А мне нужно чтоб сразу создавался массив из всех записей базы, так чтоб вероятность того что на первом месте будет 7* было в 7 раз больше чем того что 0*.
PM MAIL WWW   Вверх
bars80080
Дата 9.11.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



тогда вариант ksnk, считываешь все записи, прогоняешь через цикл и множишь их в соответствии с количеством звёзд. потом случайная выборка или перестановка
PM MAIL WWW   Вверх
ksnk
Дата 9.11.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 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;




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NNaarreekk
Дата 9.11.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Записей немножко больше чем дофига.

Цитата(ksnk @  9.11.2008,  13:05 Найти цитируемый пост)
select * from table where stars=STAR order by rand() limit 1;

Этот вариант не получится, потому что мне нужно получить id всех записей в вышеупомянутом порядке, а если каждый раз запрос отправлять серверу пипец.


Цитата(ksnk @  9.11.2008,  13:05 Найти цитируемый пост)
Если записей немного - select id,stars from table и строим массив
в котором столько Id'ов сколько старов. Из массива выбираем случайное значение. По id'у выбираем строчку таблицы

Если честно не понял идею, можно поподробнее?

Проведем промежуточный итог:
 1. Из базыне можем вибирать в случайном порядке с разными вероятностями
 2. Единственным разумным подходом оказался умножить запись на количество * и потом случайно выбрать
 3. Вопрос не так легко решился как я думал smile 

------------------------
Такая идея возникла:
Создаем массив
0=>1

1=>2
2=>2

3=>3
4=>3
5=>3
.......

Наши записи бросаем в массив, случайно выбираем элемент из  первого массива и какое число получаем из второго массива вибыраем случайно элемент из тех у кого *= нашей выбранной.

Это сообщение отредактировал(а) NNaarreekk - 9.11.2008, 11:38
PM MAIL WWW   Вверх
ksnk
Дата 9.11.2008, 13:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Мне казалось, что нужно получить одну строчку... Хотя несложно и модифицировать.

Код

$result=mysql_query('create TEMPORARY tmp_tab (
              `xid` int NOT NULL,
              `stars`int ,
              `id` int NOT NULL auto_increment,
              PRIMARY KEY  (`id`),
                          KEY `xid` (`xid`)
            );');

for ($star=0, $star<7, $star++){
    $result=mysql_query('insert into tmp_tab select `id` as xid, `star` from TABLE where `star`>'.$star.';');
}

 
 кстати, такую таблицу можно и сохранить, чтобы не пришлось ее сочинять очень часто
 Ну и результат

Код

select distinct x.* from tmp_tab left join TABLE as x on tmp_tab.xid=x.id order by rand();


Сочинялось на коленке, ошибки могут быть...


Это сообщение отредактировал(а) ksnk - 9.11.2008, 13:20


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NNaarreekk
Дата 9.11.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



ksnk, спасибо большое!

Но это не будет тормозить работу сайта, если каждый раз при входе на страницу создавалась такая таблица?

И причем каждый посетитель должен иметь свою собственную таблицу.


Хотя можно чтоб скажем 20 минут показывалась одна и та же база а потом, при следующем входе изменялась..?
PM MAIL WWW   Вверх
ksnk
Дата 9.11.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Если данных мало - тормозить не будет, если много - будет. Можно, наверное, хранить таблицы некоторое время, если юзеров не очень много. 

Вообще: практика - критерий истины.  smile 

У меня, к примеру на локалке импорт неких данных занимает 10 секунд, на целевом хостинге - 10 минут, хотя они уверяют, что их машинка на порядок шустрее моей...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NNaarreekk
Дата 9.11.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Ладно будь что будет!

Еще раз спасибо всем кто помогал!
PM MAIL WWW   Вверх
skyboy
Дата 9.11.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Код

SELECT `id`
FROM `table`
ORDER BY rand() * `stars`

диапазон возможных значений определяется коэффициентом `stars`, потому, при равномерном распределении выроятности для rand() результат rand() * 7 в 7 раз вероятнее окажется больше, чем rand() * 1
PM MAIL   Вверх
ksnk
Дата 9.11.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



skyboy, Оппа!  smile. Mysql велик и могуч!!!




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 9.11.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



не понял. это как? можно поподробнее?
PM MAIL WWW   Вверх
skyboy
Дата 9.11.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 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 секунд
что-то меня занесло smile
PM MAIL   Вверх
bars80080
Дата 10.11.2008, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



о-о-ой, я статистику автоматом получил, поэтому нифига в ней не варю

я не просёк, каким макаром число*rand() даёт нам вероятности. я думал что rand() возвращает всего лишь случайный идентификатор.
что-то надо бы почитать о действии mysql с этой функцией...
PM MAIL WWW   Вверх
skyboy
Дата 10.11.2008, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



rand() возвращает не идентификатор.
"случайный идентификатор" возвращает guid()
rand() возвращает псевдослучайное число от 0 до 1(не включая) с равномернораспределенной вероятностью каждого числа из диапазона.
т.е. вероятность возврата "0,75" равна(должна быть, но так как число - псевдослучайное, то вероятность не равномерно распределена, а имеет небольшие колебания, обусловленные многими факторами).
топикстартеру нужна была функция, которая возвращала бы (псевдо)случайные числа с вероятностью, прямопропорциональной некоему парамтру(полю stars), чтоб потом по этим (псевдо)случайным значениям отсортировать.
или как говорил сам автор:
Цитата(NNaarreekk @  7.11.2008,  19:57 Найти цитируемый пост)
чтоб вероятность вывода того у кого stars=7 было в 7 раз больше чем у stars=1...


PM MAIL   Вверх
bars80080
Дата 10.11.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



smile , надо будет потестить
PM MAIL WWW   Вверх
skyboy
Дата 10.11.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(skyboy @  10.11.2008,  02:33 Найти цитируемый пост)
т.е. вероятность возврата "0,75" равна

пока писал скобки, забыл начало предложения smile
там должно быть: "вероятность возврата "0.75" равна вероятности возврата "0.3336"
PM MAIL   Вверх
NNaarreekk
Дата 11.11.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



skyboy, ты может и будущее можешь предсказывать?? smile 

Спасибо!! smile 
PM MAIL WWW   Вверх
seos
Дата 12.11.2008, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



пробовал сделать.... неполучилось smile 
PM MAIL   Вверх
skyboy
Дата 12.11.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 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. Что немного отличается.
PM MAIL   Вверх
NNaarreekk
Дата 12.11.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Цитата(skyboy @  12.11.2008,  12:08 Найти цитируемый пост)
выбора с 8 звездами была в 4 раза выше вероятности выбора с 4 звездами.

На верно хотел сказать в 2 раза больше да?

Но в целом мне не так уж важно, но спасибо что предупредил!!
PM MAIL WWW   Вверх
skyboy
Дата 12.11.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(NNaarreekk @  12.11.2008,  17:08 Найти цитируемый пост)
На верно хотел сказать в 2 раза больше да?

вообще хотел сказать: "в 4 раза выше, чем с двумя звездами". но вообще да, описАлся.
PM MAIL   Вверх
NNaarreekk
Дата 24.1.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Люде!!
Что-то не то получается!!!!!


Цитата(skyboy @  9.11.2008,  21:15 Найти цитируемый пост)
SELECT `id`
FROM `table`
ORDER BY rand() * `stars`

У кого звездочек меньше та показывается раньше, я конечно сменю последовательность так чтоб в базе у 5звездных записей писалось 1 и т.д. но хочется понять почему так произходит???
PM MAIL WWW   Вверх
skyboy
Дата 24.1.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(NNaarreekk @  24.1.2009,  15:59 Найти цитируемый пост)
У кого звездочек меньше та показывается раньше

ну, в твоем запросе сортировка по возрастанию. то есть, сначала те, у кого 
Цитата
rand() * `stars`
 имеет меньшее значение. естественно, что вероятность оказаться "выше по порядку" у записей с меньшим количеством звезд больше. добавь DESC в секцию ORDER BY
PM MAIL   Вверх
NNaarreekk
Дата 24.1.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Цитата(skyboy @  24.1.2009,  20:57 Найти цитируемый пост)
ну, в твоем запросе сортировка по возрастанию. то есть, сначала те, у кого 

А можно было догадатся! smile 
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1400 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.