我是responding来向Reddit AskScience提问,我发现runif()
的功能有些奇怪。我正在尝试从1到52均匀采样一个集合。我的第一个想法是使用runif():
as.integer(runif(n, min = 1, max = 52))
但是,我发现该操作从未产生过52的值。例如:
length(unique(as.integer(runif(1000000, 1, 52))))
[1] 51
为了我的目的,我只是转向
sample()
:sample(52, n, replace = TRUE)
在runif()文档中指出:
我想知道为什么
runif()
这样操作。如果试图统一生成样本,则似乎应该能够从集合中产生“极值”。这是功能吗?为什么? 最佳答案
这确实是一个功能。 runif
的C source code包含以下C代码:
/* This is true of all builtin generators, but protect against
user-supplied ones */
do {u = unif_rand();} while (u <= 0 || u >= 1);
return a + (b - a) * u;
这意味着
unif_rand()
可能返回0或1,但是runif()
设计为跳过那些(不太可能)的情况。我的猜测是,这样做是为了保护在极端情况下失败的用户代码(值恰好在范围的边界上)。
此功能为implemented by Brian Ripley on Sep 19 2006(从注释中看来,
0<u<1
对于内置的统一生成器自动为true,但对于用户提供的生成器而言可能并非如此)。sample(1:52,size=n,replace=TRUE)
是实现您的目标的惯用方式(尽管不一定是最有效的)。关于r - 为什么runif()无法预测间隔最大值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46065633/