【问题标题】:Why are two random deviates needed to ensure uniform sampling of large integers with sample()?为什么需要两个随机偏差来确保使用 sample() 对大整数进行均匀采样?
【发布时间】:2013-11-19 05:30:49
【问题描述】:

鉴于以下是等价的,我们可以推断 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() 的第 1、第 3、第 5、... 来自sample() 的第 1、第 2、第 3... 的近似结果。

事实证明,两个函数都在后台调用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?

【问题讨论】:

  • 在这种情况下“正确”是什么意思?这些应该是随机的(当然它们只是伪随机,但仍然如此)。
  • 正在寻找它...啊哈:stackoverflow.com/questions/18907600/…
  • 谷歌搜索 33554432 PRNG 发现了一些有用的 (?) 东西
  • 附注33554432 = 2^25.
  • @BenBolker 啊,所以在定义之前的源代码中解释了这个/* Our PRNGs have at most 32 bit of precision, and all have at least 25 */。谢谢。

标签: r random internals prng


【解决方案1】:

原因是 25 位 PRNG 不会产生足够的位来生成范围大于 2^25 的所有可能的整数值。为了给每个可能的整数值一个非零概率,有必要调用 25 位 PRNG 两次。通过两次调用(如您引用的代码),您将获得 50 个随机位。

请注意,double 有 53 位尾数,因此两次调用 PRNG 仍然缺少 3 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2020-10-26
    • 1970-01-01
    • 2020-12-25
    • 2019-09-16
    相关资源
    最近更新 更多