r - runif() 真的有文档中所述的范围 : 0<= runif(n) <= 1, 吗?

标签 r random

我是 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_32m11/(2^32-1)所以你可以从默认生成器中得到的最小值是 1/(2^33-2)大约是 1.16e-10 .最大值是这个小于 1 的数量。

关于r - runif() 真的有文档中所述的范围 : 0<= runif(n) <= 1, 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48427049/

相关文章:

R 替换所有列的 NA 除 *

r - 如何选择可能存在或可能不存在的列?

r - 从 github 安装 knitr

Python 我无法替换我的字符串值

java - 随机替换字符串中随机数的字符

r - 关于使用 R 对 KNN 进行 k 折交叉验证的问题

r - 为什么 `[` 比 `subset` 更好?

java - 根据每个用户可预测地随机化项目列表

Javascript函数生成具有非均匀概率的随机整数

python - 随机矩阵所有行的快速随机加权选择