Вопрос

Я реализую выбор колеса рулетки, и я хотел бы сохранить как можно больше кода в SQL.Моя попытка привела к приведенному ниже запросу.$ 1 - это случайная величина того же диапазона, что и weight, которую я отправляю в SQL-код (было неясно, как заставить random() вызываться только один раз).Вес - это размер паза для ряда на колесе.random() - это функция SQLITE, которая возвращает случайное число.Вот запрос в полном объеме:

SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1

Мой вопрос в том, это все еще колесо рулетки?Базовый алгоритм потребовал бы суммирования всех весов, затем выбора случайного значения из диапазона 0 ..sum - это определило бы, какая строка была выбрана.Вместо этого эта процедура сначала фильтрует все строки, которые соответствуют одному случайному числу, затем скремблирует их порядок и выбирает первую.

Одним из незначительных изменений является использование $ 1 вместо второго вызова random().Это может сделать процедуру более справедливой, но я не уверен, что это так - это означало бы, что каждой строке был предоставлен собственный шанс быть отфильтрованной или нет.

Итак, я предполагаю, что спрашиваю, сколько стоит это зеркальное колесо рулетки, поскольку оно, очевидно, выполняет разные шаги.Но отражает ли это результаты?

Это было полезно?

Решение

Одна вещь, о которой я только что подумал, это то, что это не колесо рулетки из-за этого простого доказательства на примере:

Если бы у вас было три предмета, по одному каждого веса один, два и три, то колесо рулетки выбрало бы их с вероятностью 1/6, 2/6 и 3/6.Однако моя рутина привела бы к увеличению веса:

Filter, A  ,   B,   C
  1   , 1/3, 1/3, 1/3
  2   , 0  , 1/2, 1/2
  3   , 0  , 0  , 1

Выше вы можете видеть, что для каждого из значений filter ($1 в вопросе), элементы A, B, и C показаны с их соответствующими шансами на выбор.Сложение всего этого дало бы совокупные вероятности A, B и C быть 2/18-м, 5/18-м и 11/18-м.

Это отличается от колеса рулетки, запрос в вопросе, по-видимому, смещает больший вес.Итак, чтобы ответить на мой собственный вопрос, запрос отражает колесо рулетки, но не соответствует ему.

Это наводит меня на мысль, что если бы вы выбрали фильтр для определенного нелинейного распределения, могли бы вы все равно сделать этот запрос не только зеркальным, но и соответствующим колесу рулетки?И какое бы это было распределение?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top