以 .Machine$double.xmax 为边界的 runif
runif with .Machine$double.xmax as boundaries
我想生成一个随机实数(我猜是有理数)。
为此,我想使用 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
正如 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
,它统一变换 [0, 1] 在用户提供的区间 [a, b] 中生成随机值。在您的情况下,它将是 -M + (M + M) * u
。所以 M + M
以防它 1.79E308 + 1.79E308
生成 Inf
。 IE。 finite + Inf * finite = Inf
:
M + (M - m) * runif(1, 0, 1)
# Inf
我想生成一个随机实数(我猜是有理数)。
为此,我想使用 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
正如 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
,它统一变换 [0, 1] 在用户提供的区间 [a, b] 中生成随机值。在您的情况下,它将是 -M + (M + M) * u
。所以 M + M
以防它 1.79E308 + 1.79E308
生成 Inf
。 IE。 finite + Inf * finite = Inf
:
M + (M - m) * runif(1, 0, 1)
# Inf