为什么runif()不能预测区间最大值?

为什么runif()不能预测区间最大值?,r,R,我在会议上被问及这个问题,在runif()的功能方面,我遇到了一些奇怪的问题。我试图对一组从1到52的样本进行统一采样。我的第一个想法是使用runif(): 但是,我发现该操作从未产生52的值。例如: length(unique(as.integer(runif(1000000, 1, 52)))) [1] 51 出于我的目的,我只是转到了sample(): sample(52, n, replace = TRUE) 在runif()文档中,它指出: 除非max=min或max-min比mi

我在会议上被问及这个问题,在
runif()
的功能方面,我遇到了一些奇怪的问题。我试图对一组从1到52的样本进行统一采样。我的第一个想法是使用runif():

但是,我发现该操作从未产生52的值。例如:

length(unique(as.integer(runif(1000000, 1, 52))))
[1] 51
出于我的目的,我只是转到了
sample()

sample(52, n, replace = TRUE)
在runif()文档中,它指出:

除非max=min或max-min比min小,特别是对于默认参数,否则runif不会生成任何一个极值

我想知道为什么
runif()
会这样做。如果它试图均匀地生成样本,它似乎应该能够从集合中生成“极值”。这是一项功能吗?为什么?

as.integer(51.999)

五十一

这是因为as.integer是如何工作的


如果要从离散分布中提取,请使用sample
runif
不适用于离散发行版。

这确实是一项功能。
runif的
包含以下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;
/*这适用于所有内置发电机,但要防止
用户提供的*/
do{u=unif_rand();}while(u=1);
返回a+(b-a)*u;
这意味着
unif_rand()
可以返回0或1,但是
runif()
被设计为跳过这些(不太可能的)情况

我的猜测是这样做是为了保护在边缘情况下失败的用户代码(值正好在范围的边界上)


此功能是(从注释来看,
0
as.integer
的工作原理类似于
trunc
。它将通过将给定值向0截断而形成一个整数。由于值不能超过52(),因此它们将始终被截断为介于1和51之间的值

您将看到与
下限
(或)不同的结果。注意您必须通过添加
1
(或在
上限
的情况下调整
runif
max
)。另外请注意在这种情况下,由于
min
max
都大于0,因此您可以将
地板
替换为
trunc
作为.integer

set.seed(42)
x = floor(runif(n = 1000000, min = 1, max = 52 + 1))
plot(prop.table(table(x)), las = 2, cex.axis = 0.75)

?runif
声明函数本身不会生成任何一个极值,因此它与
as.integer
无关,但作为某一点,runif()不应该返回52?但您的观点是关于使用as.integer()。我认为它是四舍五入的,而实际上它只是删除小数。如果你想从离散分布中提取,那么就使用sample。
runif
不适用于离散分布。@useR
runif
生成任何值的概率为0,而不仅仅是最终值。请尝试使用
as.integer
。我的观点并不是说生成极值点的可能性大于0,而是那些外部点甚至没有被设计考虑在内。见@Ben的答案。得到52的概率正好是0。为什么你对没有观察到概率为0的预先指定事件感到惊讶呢orm分布是连续的-在连续分布中对任何给定值进行采样的概率为零,只有在分布的间隔内,您才能获得有限的概率-因此,即使没有实现上的问题,您也不太可能最终采样
52.000000…
。请参阅此讨论:当然我做了一些我最初尝试执行采样时出错。这就引出了一个更有趣的问题,为什么runif()不生成极值。Ben Bolker很好地回答了这个问题。另一个可以使用
runif
的方法是
天花(runif(100,min=0,max=52))
。是的。谢谢。我使用as.integer()时出错了让我看一个更有趣的问题。如果你想在整数之间均匀分布,这是有问题的:
prop.table(table(round(runif(100000,1,10)))
shows(例如)“得到两个极值中任何一个的可能性只有一半。@本博克,在进一步调查后,在
runif
中适当调整
min
max
可能会更好:
plot(prop.table)和
table(table)(floor)(runif(10000,1,52+1))),las=2)
set.seed(42)
x = floor(runif(n = 1000000, min = 1, max = 52 + 1))
plot(prop.table(table(x)), las = 2, cex.axis = 0.75)