selezione roulette Ruota con una query SQL
-
19-09-2019 - |
Domanda
I sono l'attuazione di una selezione roulette, e mi piacerebbe mantenere il più codice possibile in SQL. Il mio tentativo ha ceduto la query di seguito. $ 1 è una variabile casuale dello stesso intervallo come peso mando al codice SQL (non era chiaro come fare random () essere chiamato solo una volta). Peso è la dimensione della fessura della riga sulla ruota. random () è una funzione SQLITE che restituisce un numero casuale. Ecco la query in piena:
SELECT id
FROM items
WHERE weight >= $1
ORDER BY random()
LIMIT 1
La mia domanda è, questo è ancora la ruota della roulette? L'algoritmo di base richiederebbe la somma di tutti i pesi, quindi scegliere un valore casuale della gamma 0..sum - ciò determinare quale riga selezionata. Invece questa routine filtra prima tutte le righe che soddisfano un numero casuale, allora arrampica loro ordine e prende il primo.
Un sottile cambiamento è l'uso di $ 1 al posto di una seconda chiamata a random (). Questo può rendere la routine più giusto, ma io non sono certo lo fa -. Vorrebbe dire che ogni riga è stato dato di essa la propria possibilità di essere filtrata o non
Quindi, credo che sto chiedendo quanto costa questa roulette specchio, poiché segue ovviamente diverse fasi. Ma ci si rispecchia i risultati?
Soluzione
Una cosa che ho solo pensato è che non si tratta di roulette a causa di questo semplice dimostrazione per esempio:
Se tu avessi tre elementi, uno di ciascuno di peso uno, due e tre, poi la ruota della roulette li scegliere con 1/6, 2 / 6ths e 3 / probabilità 6ths. Tuttavia, la mia routine sarebbe polarizzazione pesi più elevati:
Filter, A , B, C
1 , 1/3, 1/3, 1/3
2 , 0 , 1/2, 1/2
3 , 0 , 0 , 1
Qui sopra potete vedere che per ciascuno dei valori di filter
($1
in questione), le voci A
, B
, e C
sono mostrati con le rispettive probabilità di selezione. Aggiungendo tutto questo fino darebbe probabilità combinati di A
, B
e C
per essere 2 / 18ths, 5 / 18ths e 11 / 18ths.
Questo è diverso da roulette, la query in questione sembra polarizzazione peso maggiore. Quindi, per rispondere alla mia domanda, la query rispecchia ruota della roulette, ma non corrisponde a esso.
Questo mi porta a chiedermi se hai scelto filtro su una particolare distribuzione non lineare, si potrebbe ancora fare questa query non solo specchio, ma partita alla roulette ruota? E che la distribuzione sarebbe?