考试 num_to_schoice 包括错误的备选方案

exams num_to_schoice to include wrong alternatives

我正在使用 num_to_choice 为使用 r exams 包的数字练习生成 5 个选项。

我希望我的 sc$questions 包括正确的解决方案 (res) 加上两个计算错误的解决方案 (err1err2)。我正在使用此代码:

sc <- num_to_schoice(res, digits=3, wrong=c(err1, err2))

我确实生成了五个选项,其中一个具有正确的解决方案 (res),但其他四个选项中的 none 包括 err1err2。阅读 num_to_choice 文档我发现:

"The wrong solutions can be provided or are generated randomly. If wrong is provided only up to 2 elements of it are used in order to assure some random solutions."

但是,在我的例子中,err1err2 选项的 none 包含在 sc$questions 中。我在这里错过了什么?如何强制 err 选项包含在 sc$questions 中?

这是一个可重现的例子:

v <- c(1225,4000,1372,974,956,940,1532,969,1070,685,220,407,903,239,283,368,483,352,77,699)
res <- sd(v)
err1 <- IQR(v)
err2 <- sqrt(var(v)*(length(v-1)/length(v)))
set.seed(1)
sc <- num_to_schoice(res, digits=3, wrong=c(err1, err2), range=c(0,max(v)))

这里是sc$questions生成的解决方案:

结果是“指定的 'wrong' 对于 'delta' 来说太小了”

在你的例子中

在你的情况下 err2res 是相同的:

identical(res, err2)
## [1] TRUE

这就是为什么 num_to_schoice() returns NULL 以及一个警告,该警告应告知您 reswrong 参数的区别太大对于给定的 delta 来说很小。因此,不可能将 res 作为正确的解决方案,将 err2 作为错误的解决方案。

问题的根源在于你计算

length(v - 1)

这与 length(v) 相同,而不是预期的

length(v) - 1

如果你这样做

err2 <- sqrt(var(v) * (length(v) - 1)/length(v))

然后你得到想要的

set.seed(1)
num_to_schoice(res, digits = 3, wrong = c(err1, err2))
## $solutions
## [1] FALSE FALSE FALSE  TRUE FALSE
## 
## $questions
## [1] "9.235$"  "4.000$"  "6.905$"  "0.517$"  "22.200$"

更普遍

根据设计 num_to_schoice() 相当保守:如果它认为无法找到一组具有所需属性的项目,它 returns NULL 而不是尝试找到近似解决方案。这是为了避免随机获得可能比预期更简单的练习。

另一个典型的例子是 range 太小 and/or 太大 delta 无法生成符合所有参数的五个答案选项列表。例如,假设我们有以下正确的解决方案和两个干扰因素:

res <- 1.234
err1 <- 2.345
err2 <- 3.456

那么,您在上面发布的命令将不起作用:

num_to_schoice(res, digits = 3, wrong = c(err1, err2))
## NULL
## Warning message:
## In num_to_schoice(res, digits = 3, wrong = c(err1, err2)) :
##   specified 'range' is too small for 'delta'

原因是本例中默认的delta为1,默认的rangec(0.5, 1.5) * res。这不够大,无法容纳 5 个至少 delta 为 1 的答案。

但是如果你增加 range(或者减少 delta)你会得到:

set.seed(1)
num_to_schoice(res, digits = 3, wrong = c(err1, err2), range = c(0, 10))
## $solutions
## [1] FALSE FALSE FALSE  TRUE FALSE
## 
## $questions
## [1] ".456$" ".345$" ".496$" ".234$" ".195$"

其中 res 在位置 4 结束,而 err1err2 分别在位置 2 和 1。