Выбор колеса рулетки с помощью SQL-запроса - PullRequest
1 голос
/ 20 августа 2009

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

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

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

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

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

1 Ответ

1 голос
/ 20 августа 2009

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

Если бы у вас было три предмета, по одному весу один, два и три, колесо рулетки выбрало бы их с вероятностью 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-м.

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

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

...