Если у вас есть записи-редко для чтения многих сценария (то есть изменить объекты и вероятность редко) вы можете предварительно вычислите значения вероятности так, чтобы, если у вас есть одно случайное значение, вы можете однозначно решить, какой объект выбрать (с одним выбором, без сортировки, без сравнения всех необходимых записей).
E.g. (Вероятности в за мельницу)
зонтичных: 500 ‰ шанса
сапог: 250 ‰ случайностей
ранец: 100 ‰ шанса
независимо: 100 ‰ шанса
"ничего": 50 ‰ шанса
Случайных число от 0 до 499 означает «зонтик», выбрано 500-749 «сапог» и так далее.
INSERT INTO foo (name, randmin, randmax) VALUES
('umbrella', 0, 499),
('boots', 500, 749),
('satchel', 750, 849),
('whatever', 850, 949)
Каждый раз, когда вы добавляете объект или изменяете вероятности, пересоздайте эту таблицу.
Тогда все, что вам нужно, это запрос как
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
Только одна случайная величина должна быть сгенерирован и MySQL может использовать индекс (randmin, RANDMAX), чтобы найти запись быстро.
Какова должна быть вероятность выбора объекта? Это хранится в базе данных или является жестко запрограммированной константой? –
Вероятно, как постоянный знак. – Don