Равномерно перенаправить пользователей на 18 различных страниц и подтвердить отправку

Есть проблемы с дизайном и буду признателен за некоторые советы.

Я ожидаю, что 540 участников завершат 18 опросов. В каждом опросе должно быть ровно 30 участников (ЗАВЕРШИТЬ / ОТПРАВИТЬ опрос, а не просто ПОСЕТИТЬ опрос). Обследования очень похожи (структурно одинаковы; отличаются только некоторыми формулировками / изображениями. Могут быть получены из одного и того же HTML).

Для этого я использовал только один html и генератор случайных чисел в html/JavaScript. При запросе страницы генерируется случайное число от 1 до 18, и в соответствии с этим числом генерируется один из 18 опросов и возвращается участнику. Это действительно удобно в том смысле, что мне нужно поддерживать только одну HTML-страницу и беспокоиться о создании разных опросов в соответствии с заданным числом. Однако я заметил, что участники распределены не совсем равномерно - у меня может быть 25 участников в одном опросе и 35 участников в другом. Возможно, это происходит из-за случайности, исходящей от генератора случайных чисел (и я предполагаю, что ничего не могу с этим поделать - поправьте меня, если я ошибаюсь).

Я ищу лучшее решение. Я думал о наличии счетчика на стороне сервера и перенаправлении участников в соответствии с количеством (например, каждый 1-й участник идет на 1-й опрос, каждый 2-й участник идет на 2-й опрос... и каждый 18-й участник идет на 18-й опрос), Однако это может гарантировать только то, что участники ПОСЕЩАЮТ опросы, но НЕ ЗАПОЛНЯЮТ / ОТПРАВЛЯЮТ опросы - участник может полностью увеличить счет, но не завершить опрос. Если он не отправляет опрос, счет не должен быть увеличен. Но если количество не увеличивается, ему (и последующим участникам) нельзя назначить опрос. Установить блокировку на счетчике нереально, потому что будет очень много участников, ожидающих получения номера и, следовательно, опроса... ах, мне нужна помощь @. @

Какие-либо решения / предложения?

Заранее спасибо за любой ответ!

3 ответа

Решение

Как насчет этого:

Создайте индивидуальные счетчики для каждого опроса и сохраните их в базе данных. Каждый раз, когда пользователь запрашивает опрос, извлекает счетчики из базы данных, выполняет итерацию по ним и возвращает первый опрос, чей счет < 30. Перенаправьте пользователя на указанный опрос и увеличьте счетчик опросов.

Чтобы убедиться, что опросы действительно представлены, вы можете сделать следующее: Создать другую таблицу в базе данных. Каждый раз, когда вы проводите опрос, вставляйте в таблицу новую запись, содержащую: unique_id, survey_id, timestamp, Передайте unique_id вместе с опросом пользователю и после отправки удалите соответствующую запись из базы данных. Теперь, прежде чем выбрать опрос (как описано выше), вы получите эти данные, и для любой записи, отметка времени которой> 10 минут назад, вы можете предположить, что она не была отправлена, и уменьшить счетчик опросов.

Ваша идея счетчика на стороне сервера великолепна. Чтобы решить проблему с людьми, не участвующими в опросе, используйте файлы cookie или какую-либо систему входа в систему, где участники должны будут идентифицировать себя (я предполагаю, что это анонимный опрос, поэтому файлы cookie лучше).

  1. Есть счетчик на стороне сервера.
  2. Когда пользователь приходит, установите ему cookie-файл с идентификатором опроса, рассчитанным по счетчику (1 - 18), чтобы вы помнили, к какому опросу принадлежит пользователь.
  3. Когда пользователь приходит, проверьте наличие файлов cookie с идентификатором - если у них есть файл cookie, отправьте его в соответствующий опрос, не увеличивая счетчик. Если это не так, увеличьте счетчик и установите для пользователя файл cookie с новым идентификатором.

Что думаете?:)

Учитывая, что A:: У вас есть 18 опросов, которые должны быть заполнены случайным образом 540 участниками, разделенными идеально на 30 заявок на опрос B: вы размещаете только один html-файл, генерирующий 1 из 18 опросов через javascript на основе числа, отправленного из сервер

Не зная, как вы сохраняете результаты опроса, я бы сказал, что хорошей стратегией может быть: сохранить рандомизированный массив последовательных чисел 1-540 на BE (используется как идентификатор для каждого опроса) и указатель, начинающийся с 0. Когда участник запрашивает страницу, присваивает им следующий номер в массиве и увеличивает указатель. Сохраните этот номер вместе с этим пользователем с cookie, чтобы они всегда видели один и тот же номер. Назначьте им опрос на основе этого числа, 1-30 - опрос 1 и т. Д.

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

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

nextSurveyId = randomSurveyIDs [surveyPointer% 540]; surveyPointer ++;

Это обеспечит повторное назначение самых старых назначенных опросов. Вы также можете вести отдельный словарь завершенных опросов по номеру для проверки при выборе следующего случайного идентификатора съемки из исходного массива, увеличивая указатель, пока не определите следующий самый старый неполный опрос для повторного назначения. Когда оба массива имеют одинаковую длину, все опросы были отправлены.

Другие вопросы по тегам