如何在R中生成0到1之间没有0和1的随机数?

时间:2015-03-23 20:36:53

标签: r

我想在R中使用runif(n = 1,min = 0,max = 1)生成随机数,但我不想要点0和1,我如何修改它以实现我的目标?

我认为它确实以某种方式生成1,请参阅我的代码

randomDim = round(runif(1)*3)+1;randomDim

[1] 4

6 个答案:

答案 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=1shape2=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之间的任何值。