|
|
|
| Имеется к примеру таблица 'gamers', со следующими записями:
login | points
Kirill | 5
Sasha | 10
Diana | 15
Запрос должен случайным образом выбрать одну запись, но с учетом значения в поле 'points'. То есть в данном случае, запрос должен выбрать Диану с вероятностью 50%, Сашу - 33% а Кирилла - 16%.
Конечно можно достать все записи, и уже из них выбрать одну. Но если можно это сделать еще в запросе, то думаю лучше в запросе:) (я правда не уверен что можно..) | |
|
|
|
|
|
|
|
для: forma
(03.12.2008 в 21:02)
| | select * from (select * from table order by points desc limit 3) order by rand() limit 1 | |
|
|
|
|
|
|
|
для: mechanic
(04.12.2008 в 08:29)
| | Переведите пожалуйста запрос на русский.
Действительно в этом запросе учитывается что чем больше значение в поле 'points' тем больше должен быть шанс? | |
|
|
|
|
|
|
|
для: forma
(04.12.2008 в 16:09)
| | Нет, конечно. | |
|
|
|
|
|
|
|
для: BinLaden
(04.12.2008 в 19:29)
| | Да вот и мне так показалось.:) | |
|
|
|
|
|
|
|
для: forma
(03.12.2008 в 21:02)
| | А это вообще реально? Что бы я зря не ходил по страшным статьям о запросах:) | |
|
|
|
|
|
|
|
для: forma
(05.12.2008 в 23:22)
| | Тут не о запросах речь, а о том как Вы себе представляете логику этого.
Если речь шла-бы о сотне запросов
, то ещё можно было-бы сказать что какое-то из трёх чисел имело приоритет
, причём случайно имело , или чисто из-за приоритета.
если случайно любое из чисел имеет хоть какой-то шанс быть выбранным
, то в одном запросе может выбераться любое число.
Или имеется в виду строгая закономерность , оформленная как-бы выглядеть случайно ?)
Напишите формулу которая будет генерировать одно из этих трёх чисел
, или любые числа относительно исходных чтобы
в таком порядке как-бы хотелось
, и в запрос случайно можно будет вставить
// и чтобы посчитать те проценты , нужно сначала узнать хотя-бы диапазон чисел или ещё и их колличество
я так думаю
хотя всегда остаётся ORDER BY (RAND()*число) LIMIT 1 | |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 01:37)
| | > Тут не о запросах речь, а о том как Вы себе представляете логику этого
А по существу можно? Человек вполне ясно сформулировал вопрос. Даже я (!) его понял.
> хотя всегда остаётся ORDER BY (RAND()*число)
Чо это даёт? | |
|
|
|
|
|
|
|
для: BinLaden
(06.12.2008 в 03:16)
| | это даёт то что уменьшеннаое число будет уменьшено случайно , и возможно до нуля :)
, но с другой стороны одни числа будут уменьшены до значения где-то в диапазоне например 5-0
другие 10-0 , что даёт большую вероятность превышения .
Хотя это как чего завернётся , может и правильнее было написать число*RAND() + число/RAND(),
зависит-же какое число ,)
по идее такая формула значит что результат в прямой зависимости от числа
и такой-же прямой от RAND()
а вопрос был задан чисто как-бы на примере трёх чисел , с какими-то случайными значениями ,
если будет ещё три таких-же числа, то как узнать что проценты желательных совпадений уменьшились в два раза ,
или всётаки зависит от числа и не зависит от общего колличества ?, а их точно будет больше.
получаются разные процентные отношения при например большинстве маленьких чисел , и меньшинстве больших
хотя я тоже не учил математику ,) | |
|
|
|
|
|
|
|
для: 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% - Кирилл? | |
|
|
|
|
|
|
|
для: 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 в 12:26)
| | или всётаки RAND() * ( point * SUM()/COUNT() )
? | |
|
|
|
|
|
|
|
для: 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
(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%
Не совсем точно, но уже что то:) | |
|
|
|
|
|
|
|
для: forma
(06.12.2008 в 16:51)
| | то-ли ещё будет , когда понавалит ещё человек 20 :)
Что-то мне так кажется что эта зависимость от pointer
будет сильно прогрессировать при присутствии супербогатых этими поинтерсами
, и тут чего-то не хватает , возможно даже какой-нибудь PI() или вообще каких-нибудь логарифмов.
но я не знаю для чего они бывают. ;)
и вроде всё просто как вычислить процент 100*(pointer/SUM)
, но что-то не очень похоже получается при одном только Билли у которого пара миллионов поинтсов :) | |
|
|
|