1

我想建立一个简单的概率练习,使得解决方案只是零和一之间的一位小数(不同于零和一)。我想使用该功能num_to_schoice,但如果我写:

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

我收到错误消息:

NULL 警告消息:在 num_to_schoice(0.3, digits = 1, range = c(0.1, 0.9)) 中:指定的“范围”对于“增量”来说太小

有人可以解释如何num_to_schoice正确使用该功能吗?

4

2 回答 2

2

让我为@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()一位数

您可以设置一个包含序列中所有九个数字的答案列表,将正确的解决方案排序到第一个位置,然后使用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()两位数

对于使用一位数的场景,num_to_schoice()它试图做太多事情,但对于一位数以上的情况,它可能很有用。具体来说,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 等这样的增量通常会很快被拾取。
于 2020-04-06T11:47:06.323 回答
1

因为您的范围是 (0, 1),所以您必须指定一个小于delta默认值 (1) 的值。该函数计算 5 个错误答案,因此每个答案都必须在您给出的范围内,并且与其他答案的距离足够远,等于delta. 您还应该使用“delta”方法,因为包作者给出了以下建议:

可以使用两种方法来生成错误的解决方案:简单地 runif 或以其他方式为具有步长 delta 的范围设置一个完整的等距网格,从中抽取一个离散的均匀样本。如果范围足够大,则首选前者,而如果范围较小(与 delta 相比),则后者表现更好。

因此,您可以尝试以下方法:

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 的练习模板,以避免出现范围太小或几乎相同的正确和错误答案的问题!这可能会导致问题、无限循环等。

对该函数的检查num_to_schoice显示,在while接近末端的地方有一个循环,可能会卡在前面提到的“无限循环”中。长话短说,您似乎需要将数字至少增加到 2,否则这个循环有可能永远不会结束。我希望答案中有 2 位数字是可以的。

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

希望现在有效。

于 2020-04-05T16:24:21.280 回答