runif 的十进制精度问题

Decimal precission problems with runif

提问人:elcortegano 提问时间:6/16/2022 最后编辑:elcortegano 更新时间:6/17/2022 访问量:172

问:

我在 R 中模拟低概率事件时遇到了问题,并想知道如何解决这个问题。runif

考虑以下示例中的一个实验,在该实验中,我们在大小为 10e9 的样本中以 5e-10 的概率模拟 TRUE 值,并检查这些样本中是否有任何一个获得了 TRUE 值。这个实验重复10次:

set.seed(123)
probability <- 0.0000000005
n_samples <- 1000000000
n_tries <- 10
for (i in 1:n_tries) {
  print(any(runif(n=n_samples, min=0, max=1) < probability))
}

上面的代码运行速度相对较快,近一半的实验重复将按预期返回 TRUE。

但是,一旦概率变为 5e-11 (),该期望就会失败,即使重复次数增加,也不会返回 TRUE 值(使用两次,但没有运气;整个过程运行了 1 小时)。probability <- 0.00000000005n_tries <- 100

这意味着返回的值的精度不及小数点后 11 位。这是出乎意料的,因为据我所知,R 的精度高达 16 位小数,我们可能需要模拟概率如此之小(大约 15 位小数)的过程。runif

这就是无法提供预期输出的原因吗?这个问题还有其他替代/解决方案吗?runif

谢谢

编辑:我做了一个测试来检查这个问题是否与边界偏差有关(导致接近 0 或 1 的极值的概率密度降低)。为此,将结果添加一个常数(例如),并与概率值加上相同的常数进行比较。但是,这似乎并不能解决问题。runifk <- 0.5

r 随机 精度 均匀分布

评论

1赞 Mohamed Desouky 6/16/2022
我认为这不是关于它可以返回小数点后 30 位尝试runifsprintf("%.30f",runif(100)[1])
0赞 elcortegano 6/16/2022
好吧,这实际上很有帮助。所以问题似乎出在运营商身上?以下比较将返回 FALSE,而它只是更改最后一个小数点的相同数字:0.694614463718608021736145019531 < 0.694614463718608021736145019532。编辑:但对于其他比较,例如,在我使用的小数点顺序中,它不会发生。我不明白这个问题。<
0赞 Mohamed Desouky 6/16/2022
这是关于'。Machine$double.eps ' try '0.6946144637186080 < 0.6946144637186081'
2赞 Mark Dickinson 6/17/2022
在默认生成器下,似乎总是生成 形式的值。您可以通过缩放 by 的输出并检查结果值是否为整数来轻松检查这一点。作为一种特殊情况,看起来似乎可能会对产生值的输出进行修正 around ,在这种情况下,永远不会产生小于 (around ) 的值。runifi / 2**32runif2**3201/2**33runif2**-331.1e-10
1赞 Mark Dickinson 6/17/2022
Смотритетакже: stackoverflow.com/a/48428360/270986

答: 暂无答案