Формула, чтобы получить следующий вопрос в викторине на основе предыдущей статистики - PullRequest
0 голосов
/ 07 октября 2018

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

Итак, у меня есть:

  • Вопрос с полем сложности (1-100)
  • Максимальный балл, который вы можете получить в вопросе (пусть будет 256)
  • Балл, набранный пользователем, достиг вопрос (х из максимум)

Я хочу, чтобыкаким-то образом объединить эти параметры в формуле, чтобы выбрать наиболее подходящий следующий вопрос для пользователя

Как я могу это сделать?

Моя идея состояла в том, чтобы сначала задать пользователю вопрос со средней трудностью, а затем проверить,пользователь набрал менее 50% от максимума, затем получил вопросы с 25-процентной сложностью, иначе получил бы 75-процентный.Затем повторите эту схему на меньшем отрезке (25-50 процентиль или 50-75 процентиль и т. Д.)

1 Ответ

0 голосов
/ 07 октября 2018

Давайте предположим, что у игрока есть фиксированная функция score = f(difficulty), которая дает для каждой сложности ожидаемый процент очков.Как только мы узнаем эту функцию, мы можем ее инвертировать и найти уровень сложности, который даст нам ожидаемый результат, который мы хотим.

Однако функция неизвестна.Но у нас есть образцы этой функции в виде наших предыдущих вопросов.Таким образом, мы можем приспособить функцию к этим образцам.Если у вас есть знания о форме зависимости, вы можете включить эти знания в форму вашей подходящей функции.Я просто приму усеченную линейную функцию:

score = f(difficulty) = max(0, min(m * difficulty + n, 1))

Два параметра, которые нам нужно найти, это m и n.Если мы удалим все примеры вопросов, где пользователь набрал 100% или 0%, мы можем игнорировать усечение.Затем у нас есть список выборок, которые образуют линейную систему уравнений:

score1 = m * difficulty1 + n
score2 = m * difficulty2 + n
score3 = m * difficulty3 + n
...

Эта система обычно не имеет решения.Итак, мы можем найти решение для наименьших квадратов.Для этого мы будем постепенно строить матрицу 2x2 A и двумерный вектор b, представляющий систему A * x = b.Начнем с нулевой матрицы и нулевого вектора.Для каждого вопроса мы будем обновлять:

/ A11  A12 \  +=  / difficulty * difficulty    difficulty \
\ A21  A22 /      \       difficulty               1      /

/ b1 \ += / difficulty * score \
\ b2 /    \        score       /

Как только мы добавим по крайней мере два вопроса, мы можем решить:

m = (A12 * b2 - A22 * b1) / (A12 * A12 - A11 * A22)
n = (A12 * b1 - A11 * b2) / (A12 * A12 - A11 * A22)

И мы можем найти трудность для ожидаемого результата:P as:

difficulty = (P - n) / m

Давайте сделаем пример.В следующей таблице приведены несколько вопросов и состояние функции после добавления вопроса.

diff   score  |   A11  A12  A22  b1     b2 |     m     n 
--------------+----------------------------+-------------
70      0.3   |  4900   70    1  21    0.3 | 
50      0.4   |  7400  120    2  41    0.7 | -0.005  0.65
40      0.5   |  9000  160    3  61    1.2 | -0.006  0.74
35      0.7   | 10225  195    4  85.5  1.9 | -0.010  0.96

Вот примерная функция и примеры вопросов:

Fitted Function

И если мы хотим найти сложность для ожидаемого результата, например, 75%, мы получаем:

difficulty(0.75) = 21.009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...