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

Форум MySQL

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

 

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

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

тема: Выбрать запись по закону случайных чисел, но с приоритетом к высоким значениям
 
 автор: forma   (03.12.2008 в 21:02)   письмо автору
 
 

Имеется к примеру таблица 'gamers', со следующими записями:
login | points
Kirill | 5
Sasha | 10
Diana | 15

Запрос должен случайным образом выбрать одну запись, но с учетом значения в поле 'points'. То есть в данном случае, запрос должен выбрать Диану с вероятностью 50%, Сашу - 33% а Кирилла - 16%.

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

  Ответить  
 
 автор: mechanic   (04.12.2008 в 08:29)   письмо автору
 
   для: forma   (03.12.2008 в 21:02)
 

select * from (select * from table order by points desc limit 3) order by rand() limit 1

  Ответить  
 
 автор: forma   (04.12.2008 в 16:09)   письмо автору
 
   для: mechanic   (04.12.2008 в 08:29)
 

Переведите пожалуйста запрос на русский.
Действительно в этом запросе учитывается что чем больше значение в поле 'points' тем больше должен быть шанс?

  Ответить  
 
 автор: BinLaden   (04.12.2008 в 19:29)   письмо автору
 
   для: forma   (04.12.2008 в 16:09)
 

Нет, конечно.

  Ответить  
 
 автор: forma   (05.12.2008 в 23:17)   письмо автору
 
   для: BinLaden   (04.12.2008 в 19:29)
 

Да вот и мне так показалось.:)

  Ответить  
 
 автор: forma   (05.12.2008 в 23:22)   письмо автору
 
   для: forma   (03.12.2008 в 21:02)
 

А это вообще реально? Что бы я зря не ходил по страшным статьям о запросах:)

  Ответить  
 
 автор: xx77   (06.12.2008 в 01:37)   письмо автору
 
   для: forma   (05.12.2008 в 23:22)
 

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

Если речь шла-бы о сотне запросов
, то ещё можно было-бы сказать что какое-то из трёх чисел имело приоритет
, причём случайно имело , или чисто из-за приоритета.
если случайно любое из чисел имеет хоть какой-то шанс быть выбранным
, то в одном запросе может выбераться любое число.
Или имеется в виду строгая закономерность , оформленная как-бы выглядеть случайно ?)

Напишите формулу которая будет генерировать одно из этих трёх чисел
, или любые числа относительно исходных чтобы
в таком порядке как-бы хотелось
, и в запрос случайно можно будет вставить

// и чтобы посчитать те проценты , нужно сначала узнать хотя-бы диапазон чисел или ещё и их колличество
я так думаю

хотя всегда остаётся ORDER BY (RAND()*число) LIMIT 1

  Ответить  
 
 автор: BinLaden   (06.12.2008 в 03:16)   письмо автору
 
   для: xx77   (06.12.2008 в 01:37)
 

> Тут не о запросах речь, а о том как Вы себе представляете логику этого

А по существу можно? Человек вполне ясно сформулировал вопрос. Даже я (!) его понял.

> хотя всегда остаётся ORDER BY (RAND()*число)

Чо это даёт?

  Ответить  
 
 автор: xx77   (06.12.2008 в 04:08)   письмо автору
 
   для: BinLaden   (06.12.2008 в 03:16)
 

это даёт то что уменьшеннаое число будет уменьшено случайно , и возможно до нуля :)
, но с другой стороны одни числа будут уменьшены до значения где-то в диапазоне например 5-0
другие 10-0 , что даёт большую вероятность превышения .
Хотя это как чего завернётся , может и правильнее было написать число*RAND() + число/RAND(),
зависит-же какое число ,)
по идее такая формула значит что результат в прямой зависимости от числа
и такой-же прямой от RAND()
а вопрос был задан чисто как-бы на примере трёх чисел , с какими-то случайными значениями ,
если будет ещё три таких-же числа, то как узнать что проценты желательных совпадений уменьшились в два раза ,
или всётаки зависит от числа и не зависит от общего колличества ?, а их точно будет больше.
получаются разные процентные отношения при например большинстве маленьких чисел , и меньшинстве больших

хотя я тоже не учил математику ,)

  Ответить  
 
 автор: BinLaden   (06.12.2008 в 08:50)   письмо автору
 
   для: xx77   (06.12.2008 в 04:08)
 

Вы же видите, что 15-ти соответствует 50% (15 / 30), 10 - 33% (10 / 30), 5 - 16% (5 / 30). Какие еще могут быть вопросы?! Для справки также: 30 = 15 + 10 + 5

Так вот как Вы предлагаете составить запрос так, чтобы при ста (100) запросах к БД в ~ 50% случаев была Диана, в ~ 33% - Саша (или как его там), а в остальных 16% - Кирилл?

  Ответить  
 
 автор: xx77   (06.12.2008 в 12:26)   письмо автору
 
   для: BinLaden   (06.12.2008 в 08:50)
 

Даже не знаю :)
По такой логике получается
RAND()*points/COUNT();
что-то вроде прямо пропорционально RAND() и points и обратно пропорционально COUNT()
, при условии что все points > 0

Если не обращать внимания на RAND() , то получится такая прямая линия
, если нарисовать график зависимости от COUNT и point
,)) то должна получиться такая прямая линия т.к. это что-то вроде плоского уравнения
,если например был-бы points в квадвате, то была-бы гипербола (?#upd полупарабола наверное точнее будет)
, и уравнение стало-бы квадратное .)
Наверное в этом и надо разобраться , насколько со слов автора с приоритетом к большим points
хотелось-бы заставить mysql случайно находить кого-нибудь :) и при том что запрос всего один
не уверен , но кажется ещё бывают прямоугольные уравнения

  Ответить  
 
 автор: xx77   (06.12.2008 в 13:25)   письмо автору
 
   для: xx77   (06.12.2008 в 12:26)
 

или всётаки RAND() * ( point * SUM()/COUNT() )
?

  Ответить  
 
 автор: forma   (06.12.2008 в 16:19)   письмо автору
 
   для: xx77   (06.12.2008 в 13:25)
 

Количество записей вообще никак не влияет на процент.
В моем случае(с Дианой, Сашей и Кириллом) вышло бы так:
RAND() * (15*30/3) - RAND() * (150)
RAND() * (10*30/3) - RAND() * (100)
RAND() * (5*30/3) - RAND() * (50)
То есть, тоже количество очков, только в 10 раз больше.
Что бы узнать процент, можно сделать к примеру так points * 100 / SUM().

Вот только все это лишнее, чисто RAND()*points вполне хватает. Так как в любом случае каждое число будет делится и умножатся на постоянные, соответственно их соотношение сохранится.
Ладно, я пойду запущу запрос 100 тысяч раз, и вернусь с результатами.:)

  Ответить  
 
 автор: forma   (06.12.2008 в 16:51)   письмо автору
 
   для: forma   (03.12.2008 в 21:02)
 

Результаты:
Если поставить "ORDER BY RAND()*`points` LIMIT 1", получается ровно наоборот, так как таблица сортируется от самого маленького значения, до самого большого.
Исправил на "ORDER BY RAND()*`points` DESC LIMIT 1", и запустил миллион раз, вот результаты:

Всего запросов: 1000000
Кирилла выбрали: 53569 раз. Это 5.3569%
Сашу выбрали: 307346 раз. Это 30.7346%
Диану выбрали: 639085 раз. Это 63.9085%


Не совсем точно, но уже что то:)

  Ответить  
 
 автор: xx77   (06.12.2008 в 17:24)   письмо автору
 
   для: forma   (06.12.2008 в 16:51)
 

то-ли ещё будет , когда понавалит ещё человек 20 :)
Что-то мне так кажется что эта зависимость от pointer
будет сильно прогрессировать при присутствии супербогатых этими поинтерсами
, и тут чего-то не хватает , возможно даже какой-нибудь PI() или вообще каких-нибудь логарифмов.
но я не знаю для чего они бывают. ;)
и вроде всё просто как вычислить процент 100*(pointer/SUM)
, но что-то не очень похоже получается при одном только Билли у которого пара миллионов поинтсов :)

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

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