Question

Je suis une sélection de mise en œuvre de roue de roulette, et je voudrais conserver le code autant que possible dans SQL. Ma tentative a donné la requête ci-dessous. 1 $ est une variable aléatoire de la même gamme que le poids que j'envoie le code SQL (on ne sait pas comment faire appeler une seule fois au hasard ()). Le poids est la taille de la fente de la rangée sur la roue. aléatoire () est une fonction de SQLITE qui renvoie un nombre aléatoire. Voici la requête en entier:

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

Ma question est, est-ce encore la roue de la roulette? L'algorithme de base nécessiterait la somme de tous les poids, puis choisir une valeur aléatoire de la gamme 0..sum - ce déterminerait quelle ligne a été sélectionnée. Au lieu de cette routine filtre d'abord toutes les lignes qui correspondent à un nombre aléatoire, brouille alors leur ordre et reprend la première.

Un changement subtil est l'utilisation de 1 $ au lieu d'un deuxième appel au hasard (). Cela peut rendre la routine plus juste, mais je ne suis pas certain que ce fait -. Cela voudrait dire que chaque ligne a été donné sa propre chance de filtrer ou non

Alors, je suppose que je vous demande combien cette roue-t roulette miroir, car il suit évidemment différentes étapes. Mais est-ce miroir les résultats?

Était-ce utile?

La solution

Une chose que je viens de pensé est que ce n'est pas la roue roulette à cause de cette simple preuve par l'exemple:

Si vous aviez trois éléments, un de chaque poids un, deux et trois, puis la roue de la roulette serait-les choisir avec 1/6, 2 / 6ths et 3 / probabilité 6ths. Cependant, ma routine serait un poids plus élevé de biais:

Filter, A  ,   B,   C
  1   , 1/3, 1/3, 1/3
  2   , 0  , 1/2, 1/2
  3   , 0  , 0  , 1

Ci-dessus vous pouvez voir que pour chacune des valeurs de filter ($1 dans la question), sont présentés les éléments A, B et C leurs chances de sélection respectives. Ajout de tout cela jusqu'à donnerait des probabilités combinées de A, B et C à être 2 / 18ths, 5 / 18ths et 11 / 18ths.

Ceci est différent de la roue de la roulette, la requête dans la question semble biais des poids plus importants. Donc, pour répondre à ma propre question, la requête reflète la roulette, mais ne correspond pas.

Cela me conduit à se demander si vous avez choisi un filtre particulier la distribution non-linéaire, pourriez-vous faire encore cette requête non seulement miroir, mais la roue roulette de match? Et quelle distribution serait-il?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top