提问人:elcortegano 提问时间:6/16/2022 最后编辑:elcortegano 更新时间:6/17/2022 访问量:172
runif 的十进制精度问题
Decimal precission problems with runif
问:
我在 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.00000000005
n_tries <- 100
这意味着返回的值的精度不及小数点后 11 位。这是出乎意料的,因为据我所知,R 的精度高达 16 位小数,我们可能需要模拟概率如此之小(大约 15 位小数)的过程。runif
这就是无法提供预期输出的原因吗?这个问题还有其他替代/解决方案吗?runif
谢谢
编辑:我做了一个测试来检查这个问题是否与边界偏差有关(导致接近 0 或 1 的极值的概率密度降低)。为此,将结果添加一个常数(例如),并与概率值加上相同的常数进行比较。但是,这似乎并不能解决问题。runif
k <- 0.5
答: 暂无答案
上一个:为什么这些数字不相等?
评论
runif
sprintf("%.30f",runif(100)[1])
<
runif
i / 2**32
runif
2**32
0
1/2**33
runif
2**-33
1.1e-10