我认为它确实以某种方式生成了1,可以看到我的代码:
randomDim = round(runif(1)*3)+1;randomDim
# [1] 4
randomDim = round(runif(1)*3)+1;randomDim
# [1] 4
关于 runif
的文档声明:
除非输入的参数满足 'max=min' 或者 'max-min' 相对于 'min' 来说很小,否则 'runif' 函数不会产生极值。特别地,默认参数情况下也不会产生。
因此, 'runif' 已经保证不会生成0或1,因此不需要进行修改。
range(runif(n = 1e8))
给出了[1] 4.889444e-09 1.000000e+00
,因此1是可能的... - Dominic Comtois1-max(runif(n = 1e8))
的结果是3.958121e-09。 - Ben Bolkerrunif(n=1, min=1e-12, max=.9999999999)
按照大众要求:
sample(1:3,1)
可能是解决您问题的答案。
它与 runif
没有任何关系,但提供了通常称为一、二和三的整数中的任意一个,各自的概率为 1/3。
尝试 sample(1:9, 1000, replace = TRUE)/10
所以你正在从1到9随机生成数字,并对其使用分数。
除了上述列出的选项之外,另一种选择是使用Beta分布生成您的数字。
具有shape1=1
和shape2=1
参数的Beta分布将为您提供平坦(即均匀)分布,其在0和1处在数学上受到限制(即不可能取任何一个值)。
rbeta(n, 1, 1)
另外,你不喜欢结果中有多少部分来自于使用round()
函数?
我问这个问题,因为如果你运行round(.97*3)+1
,你会得到一个值为4
。同样,如果你运行round(.005*3)+1
,你会得到1
。两个值.97
和.005
都是runif()
可以合理返回的合法值。因此,你不想要的结果可能与runif()
在其默认极端值返回值无关(正如其他答案中指出的那样,这些值不包括在采样值的范围内)。
无论如何,如果你仍然不信服并想要使用其他替代方案而非runif
,那么形状参数为1的beta分布在数学上确保你永远不会得到1或0,使用该参数化,你将有等概率从rbeta(n,1,1)
分布中绘制介于0和1之间的任何值。
由于在 Brent Kerby 的回答下有一些讨论,如果有疑问,您可以随时检查源代码:
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;
}
}
因此,“如果”算法拒绝所有小于或等于零和大于或等于一的值...确切的零和一是不可能的。如Ben Bolker所指出的那样,接近它们的值在浮点精度范围内是可能的。
runif(1)
即可。 - David Arenburgrunif
没有任何关系,而与round
有关。?round
的 Details 部分解释了如何得到结果为4。 - Joshua Ulrichsample(1:3,1)
就可以实现。 - Pewiround
和runif
都在按照它们所记录的方式执行,而且runif
默认情况下会按照你在问题中所要求的方式执行。 - Joshua Ulrich