鉴于以下是等价的,我们可以推断 R 使用相同的 C函数来为和runif
生成统一样本...sample()
runif()
set.seed(1)
sample(1000,10,replace=TRUE)
#[1] 27 38 58 91 21 90 95 67 63 7
set.seed(1)
ceiling( runif(10) * 1000 )
#[1] 27 38 58 91 21 90 95 67 63 7
然而,在处理大数时它们并不等价(n > 2^32 - 1
):
set.seed(1)
ceiling( runif(1e1) * as.numeric(10^12) )
#[1] 265508663143 372123899637 572853363352 908207789995 201681931038 898389684968
#[7] 944675268606 660797792487 629114043899 61786270468
set.seed(1)
sample( as.numeric(10^12) , 1e1 , replace = TRUE )
#[1] 2655086629 5728533837 2016819388 9446752865 6291140337 2059745544 6870228465
#[8] 7698414177 7176185248 3800351852
更新
正如@Arun指出runif()
1st, 2nd, 3rd ... 的近似结果的 1st, 3rd, 5th, ... 来自sample()
.
事实证明,这两个函数都unif_rand()
在幕后调用,但是,sample
给定一个参数,n
该参数大于类型的最大可表示整数,"integer"
但可以表示为整数,因为类型"numeric"
使用此静态定义来绘制随机偏差(而不是unif_rand()
仅仅在runif()
)...的情况下
static R_INLINE double ru()
{
double U = 33554432.0;
return (floor(U*unif_rand()) + unif_rand())/U;
}
在文档中有一个神秘的注释......
使用两个随机数来确保大整数的均匀采样。
为什么需要两个随机数来确保大整数的均匀采样?
常数是什么
U
,为什么它取特定值33554432.0
?