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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top