r语言 - runif() 真的有一个范围:0<= runif(n) <= 1,如文档中所述?



我是 R 的新手,但文档指出 runif(n( 返回一个介于 0 到 1 范围内的数字(包括 0 到 1(,这让我感到惊讶。我希望 0 <= runif(n( <1 - 包括 0 和不包括 1。

我用n = 100,000,000对其进行了测试,发现它从未产生过0或1。我意识到实际在浮点中达到特定值的概率真的很小,但仍然......(在双精度中,0 到 1 之间有大约 2^53 个值(。

所以我查看了R的源代码,并在r-source-trunk\srcmath\runif.c中找到

do 
{
    u = unif_rand();
} while (u <= 0 || u >= 1);
return a + (b - a) * u;

因此,根据设计,尽管有文档,但它永远不会返回 0 或 1。
这不是一个错误吗?

或者至少文档有问题?

底层的统一随机数函数在这里定义,最终输出使用此函数:

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 提到的情况下,否则永远不会返回 min 或 max,而只是调用 runif() 时并非如此。

作为参考,魔术值i2_32m11/(2^32-1),因此您可以从默认生成器获得的最小值是 1/(2^33-2),大约是 1.16e-10 。最大值是小于 1 的此金额。

文档说:

runif 不会生成任一极值,除非 max = min 或者最大最小值与最小值相比很小,特别是对于 默认参数。

使用默认参数,文档与您看到的行为一致。

相关内容

最新更新