我想在R中使用runif(n = 1,min = 0,max = 1)生成随机数,但我不想要点0和1,我如何修改它以实现我的目标?
我认为它确实以某种方式生成1,请参阅我的代码
randomDim = round(runif(1)*3)+1;randomDim
[1] 4
答案 0 :(得分:16)
runif
州的文档:
'runif'不会生成任何一个极值,除非'max = min'或'max-min'与'min'相比较小,特别是 不是默认参数。
因此,已经保证不会生成0或1,因此不需要修改。
答案 1 :(得分:3)
受欢迎的要求:
sample(1:3,1)
可能是您问题的答案。
它与runif
无关,但提供通常称为一,二和三的任何一个整数,各自的概率为1/3。
答案 2 :(得分:1)
也许是这样的,只是?
runif(n=1, min=1e-12, max=.9999999999)
答案 3 :(得分:1)
尝试sample(1:9, 1000, replace = TRUE)/10
所以你随机生成从1到9的数字并使用它上面的分数。
答案 4 :(得分:0)
由于在 Brent Kerby 的回答中有一些讨论,如果有疑问,你可以随时检查source code:
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 所述,可以接近它们达到浮点精度的值。
答案 5 :(得分:0)
上面列出的选项的替代选项是使用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之间的任何值。