gpt4 book ai didi

r - 为什么需要两个随机偏差来确保使用 sample() 对大整数进行均匀采样?

转载 作者:行者123 更新时间:2023-12-04 02:26:29 25 4
gpt4 key购买 nike

鉴于以下等价,我们可以推断 R 使用相同的 C runifsample() 生成统一样本的函数和 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

更新

@阿伦指出 runif() 的第 1、3、5、...来自 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;
}

文档中有一个神秘的注释......

Two random numbers are used to ensure uniform sampling of large integers.


  • 为什么需要两个随机数才能保证大样本的均匀采样
    整数?
  • 什么是常数U因为以及为什么它采用特定值 33554432.0 ?
  • 最佳答案

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

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

    关于r - 为什么需要两个随机偏差来确保使用 sample() 对大整数进行均匀采样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19838165/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com