我是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 这不是一个错误吗?
或至少文档有问题?
答案 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_32m1
为1/(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。