我是 R 的新手,但文档指出 runif(n( 返回一个介于 0 到 1 范围内的数字(包括 0 到 1(,这让我感到惊讶。我希望 0 <= runif(n( <1 - 包括 0 和不包括 1。
我用n = 100,000,000对其进行了测试,发现它从未产生过0或1。我意识到实际在浮点中达到特定值的概率真的很小,但仍然......(在双精度中,0 到 1 之间有大约 2^53 个值(。
所以我查看了R的源代码,并在r-source-trunk\srcmath\runif.c中找到
do
{
u = unif_rand();
} while (u <= 0 || u >= 1);
return a + (b - a) * u;
因此,根据设计,尽管有文档,但它永远不会返回 0 或 1。
这不是一个错误吗?
或者至少文档有问题?
底层的统一随机数函数在这里定义,最终输出使用此函数:
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 提到的情况下,否则永远不会返回 min 或 max,而只是调用 runif()
时并非如此。
作为参考,魔术值i2_32m1
是1/(2^32-1)
,因此您可以从默认生成器获得的最小值是 1/(2^33-2)
,大约是 1.16e-10
。最大值是小于 1 的此金额。
文档说:
runif 不会生成任一极值,除非 max = min 或者最大最小值与最小值相比很小,特别是对于 默认参数。
使用默认参数,文档与您看到的行为一致。