如果R中没有0和1,如何生成0和1之间的随机数?
我想在R中使用runif(n=1,min=0,max=1)生成随机数,但我不想要点0和1,我如何修改它来实现我的目标 我认为它确实以某种方式生成了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,因此不需要修改。简单地说,可能是这样的
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;
}
}