首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >runif()是否真的有一个范围: 0<= runif(n) <= 1,如文档中所述?

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

Stack Overflow用户
提问于 2018-01-24 16:17:20
回答 2查看 2.2K关注 0票数 5

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

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

因此,我查看了R的源代码,并在r- source -主干\src\n数学\runif.c中找到。

代码语言:javascript
复制
do 
{
    u = unif_rand();
} while (u <= 0 || u >= 1);
return a + (b - a) * u;

因此,根据设计,尽管有文档,它永远不会返回0或1。

这不是个虫子吗?

或者至少文件有问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-24 17:26:59

基础的均匀随机数函数定义为这里,最后的输出使用此函数:

代码语言:javascript
复制
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中注意到的代码前面是:

代码语言:javascript
复制
/* This is true of all builtin generators, but protect against
       user-supplied ones */

因此,min或max将永远不会返回,除非@JesseTweedle提到的情况除外,这不是调用runif()时的情况。

作为参考,神奇的值i2_32m11/(2^32-1),所以您可以从默认生成器获得的最小值是1/(2^33-2),它近似于1.16e-10。最大值是这个值不足1。

票数 9
EN

Stack Overflow用户

发布于 2018-01-24 16:47:33

文件上说:

runif将不会生成任何一个极值,除非max = min或max-min比min小,特别是对于默认参数来说不是。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48427049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档