Выбор случайных строк с различными вероятностями

54
9

Я ищу способ получить из таблицы с 400-500 строк 1 случайную строку, но не со всей вероятностью.

Например: Моя таблица выглядит так:

Объект - Ранг

    Object_A Вверх Object_B Low Object_C Normal

У меня есть 3 возможных звания для объекта, и я хотел бы, чтобы объект с рангом "Топ" получил в три раза больше шансов получить. Это должно быть похоже на 3 строки с Object_A в таблице. То же самое для Normal, но только в два раза больше шанса.

На данный момент я получил этот код...

$result = mysqli_query($link, "SELECT * FROM objects ORDER BY RAND() LIMIT 1");

спросил(а) 2015-07-03T20:39:00+03:00 4 года, 9 месяцев назад
1
Решение
64

скажем, ваш столбец ранга имеет три значения:

3 top
2 normal
1 low

Тогда вы можете сделать следующее:

$rand = rand()%3 +1;

$result = mysqli_query($link, "
SELECT * FROM (
SELECT * FROM objects ORDER BY RAND()
) as t
WHERE rank >= {$rand} LIMIT 1"
);

Ключ должен понять, где условие: rank >= {$rand}.

    Когда rand будет == 3, 33% шансов, будет возвращена только 1 верхняя запись. Когда ранд будет == 2, 33% шансов, только 1 верхняя запись (50% шансов) или 1 нормальная запись (50% шансов) будут возвращены и так далее.

Вы можете настроить вес, назначив другое число.
Например, если вы хотите, чтобы верхняя строка возвращалась примерно в 80% случаев, вы можете назначить верхнее значение 10, а затем выполните:

$rand = rand()%10 +1;

ответил(а) 2015-07-03T21:05:00+03:00 4 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема