Выберите случайную строку из таблицы, но с коэффициентами? - PullRequest
3 голосов
/ 31 марта 2010

У меня есть таблица, которая описывает различные объекты в моей системе (например, зонт, ботинки, ранец, что угодно). Каждый из этих объектов должен иметь определенную распространенность или заболеваемость. Например, зонт реже ботинок. Исходя из этих факторов, мне нужно случайным образом выбрать один объект (включая пустой или «объект не найден») на основе этого значения инцидента.

Хлоп. Имеет смысл?

Ответы [ 3 ]

1 голос
/ 31 марта 2010

Если у вас есть сценарий «запись-редко-чтение-много» (т.е. вы редко меняете объекты и вероятности), вы можете заранее рассчитать значения вероятности, чтобы при наличии единственного случайного значения вы могли однозначно решить, объект для выбора (с одним выбором, без сортировки, без сравнения всех записей).

например. (вероятности на мельницу)
зонт: 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 может использовать индекс on (randmin, randmax) для быстрого поиска записи.

1 голос
/ 31 марта 2010
SELECT * FROM some_table
WHERE (100*RAND()) > some_table.percent_probability
LIMIT 1

.... и вероятность выбора сохраняется в поле процент_проблемости.

С

0 голосов
/ 31 марта 2010

Я собираюсь изменить ответ symcbean для этого, +1 для symcbean.

SELECT * FROM some_table
WHERE (100*RAND()) < some_table.percent_probability

Это вернет ВСЕ результаты, которые соответствуют вероятности, которую вы интуитивно хотите присвоить им. Например, 5 объектов с вероятностью 20 будут возвращены в 20% случаев. Объекты со значением 90 будут возвращены в 90% случаев.

Таким образом, ваш результат будет более чем одним объектом, но вы не позволили редким из них появляться так часто. Так что теперь просто возьмите один из ваших результатов наугад. Самый простой способ - поместить их все в массив и:

$items = array(); // assuming you've already filled $items with your 
                  // query results, one item for each array key

$count = count($items);

$chosen_key = rand(1,$count)-1;

$chosen_item = $items[$chosen_key];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...