runif与.Machine $ double.xmax作为边界

时间:2018-03-18 09:09:47

标签: r random precision uniform-distribution

我想生成一个随机的真实(我猜是理性的)数字。

要做到这一点,我想使用runif(1, min = m, max = M),我的想法是尽可能地设置m; M(绝对),以使间隔尽可能大。这让我想到了我的问题:

M <- .Machine$double.xmax
m <- -M
runif(1, m, M)
## which returns
[1] Inf

为什么不返回号码?选择的间隔是否太大了?

PS

> .Machine$double.xmax
[1] 1.797693e+308

1 个答案:

答案 0 :(得分:1)

mt1022暗示原因是在runif C source中:

double runif(double a, double b)
{
    if (!R_FINITE(a) || !R_FINITE(b) || b < a)  ML_ERR_return_NAN;

    if (a == b)
    return a;
    else {
    double u;
    /* This is true of all builtin generators, but protect against
       user-supplied ones */
    do {u = unif_rand();} while (u <= 0 || u >= 1);
    return a + (b - a) * u;
    }
}

return参数中,您可以看到公式a + (b - a) * u,它在用户提供的时间间隔[a,b]中均匀地变换[0,1]生成随机值。在您的情况下,它将为-M + (M + M) * u。因此,M + M1.79E308 + 1.79E308生成Inf的情况下。即finite + Inf * finite = Inf

M + (M - m) * runif(1, 0, 1)
# Inf