случайные вопросы с сервера sql - PullRequest
0 голосов
/ 20 июля 2010

Я работаю над приложением для опроса.У меня есть база данных sql server, содержащая до 3000 опросных вопросов.Я звоню в базу данных для набора из 10 вопросов.Я должен убедиться, что ни один из вопросов не будет повторен в течение максимально возможного времени.Каков наилучший из возможных подходов?Написать собственный алгоритм рандомизации или SQL-сервер предоставляет некоторые функциональные возможности.

Ответы [ 5 ]

1 голос
/ 20 июля 2010

Не могли бы вы просто отслеживать последний полученный идентификатор вопроса.Затем всегда извлекайте следующий вопрос с более высоким идентификатором, чем предыдущий.Если ничего не возвращено, возьмите первый / самый низкий.

Он не будет хорошо масштабироваться, но тогда он не будет звучать так, как вам нужно масштабировать.

0 голосов
/ 20 июля 2010

Этот вид звучит как домашнее задание. Если акцент действительно сделан на том, чтобы вопрос никогда не повторялся до тех пор, пока это не станет абсолютно необходимым, тогда я бы предложил добавить столбец или другую таблицу.с полем TimesUsed.

Сначала у вас будет все 3000 записей с TimesUsed 0. Возьмите 10

SELECT TOP 10 QUESTIONS WHERE TimesUsed = (SELECT MIN(TimesUsed) FROM Questions)

и ОБНОВИТЕ таблицу, в которой для этого вопроса TimesUsed установлено значение TimesUsed +1.

Это простой подход, и вам придется учитывать, если у вас не было количества вопросов, поровну делимых на 10, но я оставлю это вам:)

Конечно, все это на самом деле не имеет значения, если вы не устали от того, что никогда не повторяете одно, пока все они не будут использованы.

0 голосов
/ 20 июля 2010

Вы можете выбирать вопросы, основываясь на комбинации генератора случайных чисел и частотомера, на самом вопросе.

Если вам всегда требовалось 10 вопросов, начните с набора вопросов с наименьшей частотой использования, затем примените генератор случайных чисел, чтобы выбрать из этого набора. Увеличьте частоту этих вопросов. Эти последние задаваемые вопросы имеют более высокую частоту, чем остальная часть пула, поэтому они игнорируются при следующем проходе.

Процесс продолжается до тех пор, пока все вопросы не перейдут на следующую частоту, и весь пул снова не станет доступным.

0 голосов
/ 20 июля 2010

На самом деле, получить случайный набор - это только половина проблемы. Что вам действительно нужно, так это новый случайный набор, содержащий записи, которые не были выбраны ранее.

Вот статья Джеффа Этвуда, в которой говорится о «перетасовке», которая может вам помочь: Перемешивание и последующая статья Опасность наивности .

0 голосов
/ 20 июля 2010
SELECT question_id
FROM questions 
ORDER BY NEWID()

дает вам все идентификаторы вопросов в случайном порядке. сохраните список и двигайтесь вниз.

Нет способа обеспечить наибольшее время между повторами без сохранения порядка. Вы можете сделать это другим столбцом в той же таблице ...

РЕДАКТИРОВАТЬ: вариант идеи г-на Жака:

как насчет столбца с именем random? Перемешать порядок так:

update questions set random = (
    SELECT question_id
    FROM questions 
    ORDER BY NEWID()
)

затем получите каждый новый вопрос, подобный этому:

select * where random = 'prev_question_id';

Тогда вы можете перетасовывать порядок с интервалами, возможно, каждую ночь.

...