我是 R 的新手,但文档中指出 runif(n) 返回一个 0 到 1 范围内的数字,这让我感到惊讶。
我希望 0 <= runif(n) < 1 - 包括 0,不包括 1。
我用 n = 100,000,000 对其进行了测试,发现它从未产生 0 或 1。我意识到在浮点中实际命中特定值的概率非常小,但仍然......(之间有类似 2^53 的值0 和 1 double )。
所以我查看了 R 的源代码,发现在 r-source-trunk\src\nmath\runif.c
do
{
u = unif_rand();
} while (u <= 0 || u >= 1);
return a + (b - a) * u;
因此,按照设计,尽管有文档,它永远不会返回 0 或 1。
这不是bug吗?
或者至少文档有问题?
最佳答案
底层统一随机数函数定义为here最终输出使用这个函数:
static double fixup(double x)
{
/* ensure 0 and 1 are never returned */
if(x <= 0.0) return 0.5*i2_32m1;
if((1.0 - x) <= 0.0) return 1.0 - 0.5*i2_32m1;
return x;
}
尽管如此,还是有形式为
/* in [0,1) */
的评论。对于每个生成器的返回函数,我认为这是上面给出的错误。当然,您在 runif.c 中注意到的代码前面是:
/* This is true of all builtin generators, but protect against
user-supplied ones */
因此,除非@JesseTweedle 提到的情况,否则永远不会返回最小值或最大值,而仅调用
runif()
时情况并非如此。 .作为引用,魔值
i2_32m1
是 1/(2^32-1)
所以你可以从默认生成器中得到的最小值是 1/(2^33-2)
大约是 1.16e-10
.最大值是这个小于 1 的数量。
关于r - runif() 真的有文档中所述的范围 : 0<= runif(n) <= 1, 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48427049/