seleção roleta com uma consulta SQL
-
19-09-2019 - |
Pergunta
Estou implementando uma seleção roleta, e eu gostaria de manter o máximo de código possível no SQL. Minha tentativa rendeu a consulta abaixo. $ 1 é uma variável aleatória do mesmo intervalo do peso que eu enviar para o código SQL (que não estava claro como fazer random () ser chamado apenas uma vez). O peso é o tamanho do entalhe da linha no volante. aleatória () é uma função SQLITE que retorna um número aleatório. Aqui está a consulta na íntegra:
SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1
A minha pergunta é, isso é ainda a roleta? O algoritmo básico exigiria o somatório de todos os pesos, em seguida, escolher um valor aleatório do 0..sum gama - isso seria determinar qual linha foi selecionado. Em vez esta primeira filtros de rotina todas as linhas que atendem um número aleatório, então embaralha sua ordem e pega o primeiro.
Uma mudança sutil é o uso de US $ 1 em vez de uma segunda chamada para random (). Isso pode tornar o mais justo de rotina, mas eu não estou certo de que ele faz -. Isso significaria que cada linha foi dada a sua própria chance de ser filtrada ou não
Então, eu acho que eu estou perguntando quanto faz isso roleta espelho, uma vez que, obviamente, segue diferentes etapas. Mas fá-lo espelhar os resultados?
Solução
Uma coisa que eu só pensava é que este não é roleta por causa desta prova simples por exemplo:
Se você tivesse três itens, um de cada um peso, dois e três, então a roleta iria escolher-los com 1 / 6th, 2 / 6ths e 3 / 6ths probabilidade. No entanto, a minha rotina seria viés maior peso:
Filter, A , B, C
1 , 1/3, 1/3, 1/3
2 , 0 , 1/2, 1/2
3 , 0 , 0 , 1
Acima você pode ver que para cada um dos valores de filter
($1
na questão), os itens A
, B
e C
são mostrados com as respectivas possibilidades de seleção. Adicionando-se tudo isso daria probabilidades combinadas de A
, B
e C
ser 2 / 18ths, 5 / 18ths e 11 / 18ths.
Isto é diferente de roda de roleta, a consulta na questão parece bias pesos maiores. Então, para responder à minha própria pergunta, a roleta espelhos de consulta, mas não combiná-lo.
Isso me leva a perguntar se você escolheu filtro em uma distribuição não-linear particular, você poderia ainda fazer esta consulta não só espelho, mas roda jogo de roleta? E o que a distribuição seria?