Я реализую выбор колеса рулетки, и я хотел бы сохранить как можно больше кода в SQL. Моя попытка привела к запросу ниже. $1 — это случайная переменная того же диапазона, что и вес, который я отправляю в код SQL (было неясно, как заставить random() вызываться только один раз). Вес - это размер прорези ряда на колесе. random() — это функция SQLITE, которая возвращает случайное число. Вот запрос полностью:
SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1
У меня вопрос, это все еще колесо рулетки? Базовый алгоритм потребовал бы суммирования всех весов, а затем выбора случайного значения в диапазоне 0..sum — это определило бы, какая строка была выбрана. Вместо этого эта подпрограмма сначала фильтрует все строки, которые соответствуют одному случайному числу, затем перемешивает их порядок и выбирает первую.
Одним тонким изменением является использование $1 вместо второго вызова random(). Это может сделать подпрограмму более справедливой, но я не уверен, что это так — это означало бы, что каждой строке был предоставлен собственный шанс быть отфильтрованным или нет.
Итак, я думаю, я спрашиваю, сколько стоит это зеркальное колесо рулетки, поскольку оно явно следует другим шагам. Но отражает ли это результаты?