как использовать функцию `` `num_to_schoice ()` ``? - PullRequest
1 голос
/ 05 апреля 2020

Я хотел бы построить простое вероятностное упражнение, чтобы решение представляло собой одно десятичное число от нуля до единицы (отличное от нуля и единицы). Я хотел бы использовать функцию num_to_schoice, но если я напишу:

num_to_schoice(0.3,digits=1,range=c(0.1,0.9))

, я получу сообщение об ошибке:

NULL Предупреждение: в num_to_schoice (0,3, цифры = 1, диапазон = c (0,1, 0,9)): указанный «диапазон» слишком мал для «дельты»

Может кто-нибудь объяснить, как правильно использовать функцию num_to_schoice?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Позвольте мне добавить пару пунктов к существующему ответу @Edward (+1):

Если вы генерируете решение из последовательности 0.1, 0.2, ..., 0.9 и хотите четыре из оставшихся восемь чисел в качестве отвлекающих факторов, я бы рекомендовал не использовать num_to_schoice(). Только если перейти к правильному решению в 0.10, 0.11, 0.12, ..., 0.9, скажем, я бы использовал num_to_schoice().

Без num_to_schoice() для одного ди git

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

Например, в генерации данных вам нужно что-то вроде этого:

sol <- 0.3
ans <- c(sol, setdiff(1:9/10, sol))
ans <- paste0("$", ans, "$")

В вопрос вы можете включить

answerlist(ans, markup = "markdown")
## Answerlist
## ----------
## * $0.3$
## * $0.1$
## * $0.2$
## * $0.4$
## * $0.5$
## * $0.6$
## * $0.7$
## * $0.8$
## * $0.9$

Наконец, метаинформация требует:

exsolution: 100000000
exshuffle: 5

Тогда будет использовано правильное решение и четыре из восьми ложных ответов - все в случайном порядке. (Обратите внимание, что в приведенном выше примере используется синтаксис .Rmd, для .Rnw его необходимо соответствующим образом адаптировать.)

с num_to_schoice() для двух цифр

Для сценария с одним ди git с использованием num_to_schoice(), который пытается сделать слишком много вещей, но для более чем одного di git это может быть полезно. В частности, num_to_schoice() гарантирует, что ранг правильного решения неинформативен, т. Е. Правильным решением может быть наименьшее, второе наименьшее, ..., наибольшее число в отображаемой последовательности с равным вероятность. В частности, это может быть важно, если распределение правильного решения не является равномерным по возможному диапазону. Это причина того, почему следующий код иногда дает сбой:

num_to_schoice(0.3, digits = 1, delta = 0.1, range = c(0.1, 0.9))

Внутренне это сначала решает, сколько из четырех неправильных ответов должно быть слева от правильного решения 0.3. Очевидно, что слева может быть не более двух неправильных ответов, что может привести к предупреждению и результату NULL в случае превышения. Переход к двум цифрам может решить эту проблему, например:

num_to_schoice(0.31, range = c(0.01, 0.99),
  digits = 2, delta = 0.03, method = "delta")

Примечания:

  • Лично я бы сделал это, только если правильное решение может потенциально также есть две цифры. В противном случае учащиеся могут выбрать этот шаблон.
  • Вы должны убедиться, что слева и справа от правильного решения есть как минимум 4 * delta, чтобы было достаточно места для неправильных ответов.
  • Конечно, возможно использование delta = 0.01, но если вам нужны большие дельты, то delta = 0.03 или delta = 0.07 также часто являются полезными вариантами. Это связано с тем, что выборка из эквидистантной сетки с такой дельтой обычно не заметна большинству студентов. Напротив, дельты как 0,05, 0,1, 0,02 и т. Д. 1056 *. как правило, подобраны быстро.
1 голос
/ 05 апреля 2020

Поскольку ваш диапазон (0, 1), вы должны указать меньшее delta, чем значение по умолчанию (1). Функция рассчитывает 5 неправильных ответов, поэтому каждый должен находиться в пределах диапазона, который вы даете И достаточно далеко от других ответов на величину, равную delta. Вам также следует использовать метод «delta», так как авторы пакетов дают следующий совет:

Для генерации неправильных решений могут использоваться два метода: либо просто runif, либо иное полное уравнение -дистанционная сетка для диапазона с шагом дельта размера, из которого берется дискретный равномерный образец. Первое предпочтительнее, если диапазон достаточно большой , а второе работает лучше, если диапазон мал (по сравнению с дельтой).

Таким образом, вы можете попробовать следующее:

num_to_schoice(0.3, digits=1, range=c(0.1, 0.9), delta=0.05, method="delta")
#$solutions
#[1] FALSE FALSE FALSE  TRUE FALSE

#$questions
#[1] "$0.6$" "$0.5$" "$0.3$" "$0.4$" "$0.8$"

Обратите внимание, что эта функция включает в себя случайность, поэтому вам может потребоваться несколько раз, прежде чем появится правильное решение. Просто продолжайте игнорировать ошибки.


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

Шаблоны упражнений, использующие num_to_schoice, должны быть тщательно протестированы, чтобы избежать проблем со слишком маленькими диапазонами или почти одинаковыми правильными и неправильными ответами! Это может вызвать проблемы, бесконечные циклы и т. Д. c.

Проверка функции num_to_schoice показала, что рядом с концом имеется while l oop, который может застрять в вышеупомянутом "бесконечном l oop". Короче говоря, похоже, вам нужно увеличить цифры как минимум до 2, иначе есть вероятность, что это l oop никогда не закончится. Я надеюсь, что в ответах будет две цифры.

num_to_schoice(0.3, digits=2, range=c(0.1, 0.9), delta=0.01, method="delta")

$solutions
[1] FALSE FALSE FALSE  TRUE FALSE

$questions
[1] "$0.23$" "$0.42$" "$0.22$" "$0.30$" "$0.54$"

Я пробовал это 10 000 раз, и он всегда возвращал ненулевой результат.

res <- NULL
for(i in 1:10000){
  res[[i]] <- num_to_schoice(0.3, digits=2, range=c(0.1, 0.9), delta=0.01, method="delta")
}
sum(sapply(res, function(x) any(is.null(x))))
# [1] 0

Надеюсь, что это работает сейчас.

...