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

如果R中没有0和1,如何生成0和1之间的随机数?,r,R,我想在R中使用runif(n=1,min=0,max=1)生成随机数,但我不想要点0和1,我如何修改它来实现我的目标 我认为它确实以某种方式生成了1,请参见我的代码 randomDim = round(runif(1)*3)+1;randomDim # [1] 4 runif的文档说明: 除非“max”,否则“runif”不会生成任何一个极值 =min'或“max-min”与“min”相比较小,尤其是 不适用于默认参数 因此,已经保证不会生成0或1,因此不需要修改。简单地说,可能是这样的

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

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

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

  # [1] 4

runif
的文档说明:

除非“max”,否则“runif”不会生成任何一个极值 =min'或“max-min”与“min”相比较小,尤其是 不适用于默认参数


因此,已经保证不会生成0或1,因此不需要修改。

简单地说,可能是这样的吧

runif(n=1, min=1e-12, max=.9999999999)
应大众要求:
示例(1:3,1)
可能是您问题的答案。
它与
runif
无关,但提供了通常称为1、2和3的任何一个整数,其概率分别为1/3。

因为在Brent Kerby的答案下有一些讨论,如果有疑问,您可以随时检查:

double runif(双a,双b)
{
如果(!R_FINITE(a)| |!R_FINITE(b)| | b
所以“案例”算法拒绝所有小于或等于零、大于或等于一的值。。。精确的零和一是不可能的。如Ben Bolker所述,接近浮点精度的值是可能的。

尝试
sample(1:9,1000,replace=TRUE)/10


因此,您随机生成从1到9的数字,并在上面使用分数。

上面列出的数字的另一种选择是使用Beta分布生成数字

带有
shape1=1
shape2=1
参数的贝塔分布将为您提供一个平坦(即均匀)分布,该分布在数学上限制为0和1(即,不可能采用任何一个值)

rbeta(n,1,1)

另外,您不喜欢的结果有多少是因为您使用了
round()
函数

我这样问是因为如果你要运行
round(.97*3)+1
,你会返回
4
。同样,如果您运行
轮(.005*3)+1
,您将得到
1
.97
.005
都是合法值,
runif()
可以合理地返回。因此,您不想要的结果可能与返回默认极端值的
runif()
无关(正如在其他答案中所指出的,它不包括在从中采样的值范围内)


在任何情况下,如果您仍然不相信并且想要一些东西而不是
runif
,那么形状参数等于1的beta分布将在数学上确保您永远不会得到1或0,并且通过该参数化,您将有均等的机会在
rbeta(n,1,1)中绘制0和1之间的任何值
分发

0和1是默认值,只需执行
runif(1)
您的示例与
runif
无关,与
round
有关。
?round
的详细信息部分解释了如何得到4的结果。@JoshuaUlrich,有什么建议可以解决这个问题吗?如果您确实希望生成一个间隔为1-3的随机整数(您的代码建议)
示例(1:3,1)
可以帮您解决。@Pewi,我认为您应该将您的评论作为答案发布。这是OP真正问题的答案…我认为它确实以某种方式生成了1,请参见我的代码randomDim=round(runif(n=1,min=0,max=1)*3)+1;randomDim[1]4为什么这表明它会生成1?如果输出4生成的值大于2.5/3.0=0.833…
范围(runif(n=1e8))
给了我
[1]4.889444e-09 1.000000e+00
,那么1是可能的…@DominicComtois,不太可能(我想):
1-max(runif(n=1e8))
是3.958121e-09@DominicComtois:
1.000000e+00
!=<代码>1.0
<代码>种子集(21);r那是不必要的<默认情况下,code>runif不包括极端值。
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;
    }
}