Нужна функция распределения вероятностей.
Если принять за x длину очереди в туалет, то большему х будет соответствовать меньшая вероятность.
Возьмите для примера распределение Пуассона с коэффициентом 1 (1^x * exp(-1)/factorial(x)). В этом случае меньшей длине очереди будет соответствовать большая вероятность.
Дальше генерируете случайное число от 0 до 1. Для каждой строки из таблицы высчитываете по своей формуле эту «длину очереди в туалет» (привязалось, сами виноваты). Высчитываете вероятность по Пуассону. Сравниваете с «рандомным» числом с нужной точностью. Если есть совпавшие строки, добавляете в выборку. Очевидно, что совпадений будет больше там, где кривая вероятности распределения выше (длина очереди в туалет около 0) (см. график).
Выражаясь языком SQL
select table1.*
, power(1,your_x)*exp(-1)/factorial(your_x)
from table1
where 1=1
and round(dbms_random.value, 5)=round(power(1,your_x)*exp(-1)/factorial(your_x),5)
Подзапрос для вычисления факториала опустил.
Такой запрос не сработает, так как количество генераций случайного числа равно количеству строк в таблице. Количество генераций должно быть больше, что бы увидеть нужное распределение. Одним запросом, как мне кажется, не обойтись. Получится долго выполняемая процедура.
Я бы пометил заранее нужный небольшой список, содержащий необходимые рестораны с нужным распределением (т.е. хороших ресторанов там будет больше). А из этого списка выводил «рандомно» необходимое число ресторанов.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.