我是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()这样操作。如果试图统一生成样本,则似乎应该能够从集合中产生“极值”。这是功能吗?为什么?

最佳答案

这确实是一个功能。 runifC 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/

10-11 08:45