2015-11-07 4 views
4

Как выбрать случайную строку из базы данных на основе вероятности вероятности, присвоенной каждой строке.
Пример:выберите случайное значение, основанное на вероятности вероятности

Make  Chance Value 
ALFA ROMEO 0.0024 20000 
AUDI  0.0338 35000 
BMW   0.0376 40000 
CHEVROLET 0.0087 15000 
CITROEN  0.016 15000 
........ 

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

Будет ли комбинация rand() и ORDER BY работать? Если да, то каков наилучший способ сделать это?

+0

Есть ли шансы на 1? 'SELECT SUM (ШАНС) ИЗ таблицы'? – lad2025

+0

Возможно, вы найдете это полезным: http://jan.kneschke.de/projects/mysql/order-by-rand/ и это: http://stackoverflow.com/questions/4329396/mysql-select-10-random- rows-from-600k-rows-fast –

+0

@ lad2025 yes, сумма составляет 1,0001 – Dharman

ответ

7

Вы можете сделать это, используя rand(), а затем используя суммарную сумму. Если предположить, что они добавляют до 100%:

select t.* 
from (select t.*, (@cumep := @cumep + chance) as cumep 
     from t cross join 
      (select @cumep := 0, @r := rand()) params 
    ) t 
where @r between cumep - chance and cumep 
limit 1; 

Примечания:

  • rand() вызывается один раз в подзапроса для инициализации переменной. Несколько нежелательных звонков на rand().
  • Существует вероятность того, что случайное число будет точно на границе между двумя значениями. limit 1 произвольно выбирает 1.
  • Это можно сделать более эффективным, остановив подзапрос, когда cumep > @r.
  • Значения не должны быть в каком-либо определенном порядке.
  • Это может быть изменено для обработки шансов, когда сумма не равна 1, но это был бы другой вопрос.
+0

У меня недостаточно знаний, чтобы проверить вашу математику, но эмпирически это проверяет, я отмечаю как правильно – Dharman

Смежные вопросы