【问题标题】:runif with .Machine$double.xmax as boundariesrunif 以 .Machine$double.xmax 作为边界
【发布时间】:2018-08-27 00:33:58
【问题描述】:

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

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

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

为什么不返回数字?选择的间隔是否太大?

附言

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

【问题讨论】:

  • 有趣的问题。解决方法是M * runif(1, -1, 1)
  • 这里是runif的来源:github.com/wch/r-source/blob/…。看起来M 是最大双精度数,而M - (-M) 将大于最大双精度数,因此b - a 将是Inf,这可以解释为什么a + (b - a) * uInf

标签: r random precision uniform-distribution


【解决方案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 + M 以防它1.79E308 + 1.79E308 生成Inf。 IE。 finite + Inf * finite = Inf:

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

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2011-07-20
    • 2015-09-17
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多