我是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中找到。
do
{
u = unif_rand();
} while (u <= 0 || u >= 1);
return a + (b - a) * u;因此,根据设计,尽管有文档,它永远不会返回0或1。
这不是个虫子吗?
或者至少文件有问题?
发布于 2018-01-24 17:26:59
基础的均匀随机数函数定义为这里,最后的输出使用此函数:
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 */因此,min或max将永远不会返回,除非@JesseTweedle提到的情况除外,这不是调用runif()时的情况。
作为参考,神奇的值i2_32m1是1/(2^32-1),所以您可以从默认生成器获得的最小值是1/(2^33-2),它近似于1.16e-10。最大值是这个值不足1。
发布于 2018-01-24 16:47:33
文件上说:
runif将不会生成任何一个极值,除非max = min或max-min比min小,特别是对于默认参数来说不是。
使用默认参数,文档与您看到的行为是一致的。
https://stackoverflow.com/questions/48427049
复制相似问题