runif()是否确实有一个范围:0< = runif(n)< = 1,如文档中所述?

时间:2018-01-24 16:17:20

标签: r random

我是R的新手,但是文档通过声明runif(n)返回0到1 包含范围内的数字让我感到惊讶。 我希望0< = runif(n)< 1 - 包括0而不包括1.

我用n = 100,000,000测试它,发现它从未产生0或1.我意识到实际在浮点上击中特定值的概率非常小,但仍然......(有类似2 ^双精度中53个值介于0和1之间。

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

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

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

或至少文档有问题?

3 个答案:

答案 0 :(得分:4)

文档说:

  除非max = min,否则

runif不会生成任何极值   或者max-min与min相比较小,特别是不适用于   默认参数。

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

答案 1 :(得分:4)

底层均匀随机数函数定义为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_32m11/(2^32-1),因此您可以从默认生成器获得的最小值为1/(2^33-2),大约为1.16e-10。最大值是此数量的1。

答案 2 :(得分:1)

即使runif完全模拟了[0,1]上的均匀分布,在集合{0,1}中看到值的概率为0.不仅仅是&#34;非常小&#34正好0.当x在{0,1}时,g = 1,否则为0。那么g在[0,1]上的积分是0。