Si vous avez un scénario d'écriture rarement en lecture beaucoup (vous changer les objets et les probabilités rarement), vous voudrez peut-être pré calculer les valeurs de probabilité de sorte que si vous avez une seule valeur aléatoire, vous pouvez décider sans ambiguïté quel objet choisir (avec un seul choix, aucun tri, aucune comparaison de tous les enregistrements nécessaires).
E.g. (Probabilités par moulin)
parapluie: 500 ‰ hasard
bottes: 250 ‰ hasard
Cartable: 100 ‰ hasard
tout: 100 ‰ hasard
"rien": 50 ‰ hasard
Un hasard nombre entre 0 et 499 signifie "parapluie" a été choisi, 500-749 "bottes" et ainsi de suite.
INSERT INTO foo (name, randmin, randmax) VALUES
('umbrella', 0, 499),
('boots', 500, 749),
('satchel', 750, 849),
('whatever', 850, 949)
Chaque fois que vous ajoutez un objet ou modifiez les probabilités, recréez ce tableau.
Ensuite, tout ce dont vous avez besoin est une requête comme
SELECT
f.name
FROM
(
SELECT Round(Rand()*1000) as r
) as tmp
JOIN
foo as f
ON
r BETWEEN f.randmin and f.randmax
LIMIT
1
Une seule valeur aléatoire doit être généré et MySQL peut utiliser un index sur (randmin, randmax) pour trouver l'enregistrement rapidement.
Quelle devrait être la probabilité de ne sélectionner aucun objet? Est-ce stocké dans la base de données ou est-ce une constante codée en dur? –
Probable comme marque constante. – Don