Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要在R中编写一个新的随机生成器_R_Random - Fatal编程技术网

需要在R中编写一个新的随机生成器

需要在R中编写一个新的随机生成器,r,random,R,Random,我需要在-1,1之间生成7个随机数,它们的和等于1。我使用这个代码来实现这一点 diff(c(0, sort(round(runif(7,-1,1),2)), 1)) 但我有一个大问题 此代码的一个输出是-0.89,0.21,0.00,0.21,0.30,0.19,0.61,-0.63 问题是它是统一的,我想它每次都会在第一个和最后一个数字中生成大的随机数,这不是我想要的。我需要把它传播到所有的人。 例如0.22-.21.33-.12 0.11 0.35-0.08(举例来说,总和不等于1)

我需要在-1,1之间生成7个随机数,它们的和等于1。我使用这个代码来实现这一点

 diff(c(0, sort(round(runif(7,-1,1),2)), 1))
但我有一个大问题

此代码的一个输出是-0.89,0.21,0.00,0.21,0.30,0.19,0.61,-0.63

问题是它是统一的,我想它每次都会在第一个和最后一个数字中生成大的随机数,这不是我想要的。我需要把它传播到所有的人。 例如0.22-.21.33-.12 0.11 0.35-0.08(举例来说,总和不等于1)


你知道我能为谁编写一个代码来获得这种随机数吗?

可能有两种解决方案,它们都适用于无限循环:

解决方案1:

你可以考虑6个随机数,1个依赖项,它们的总和可以是1个。但是,一个元素可能会大于1或小于-1。因此,我们不能接受所有的答案

while(T){
  res<-runif(6,-1,1)

  res<-append(res,1-sum(res))

  if(sum(res>1)==0)
    break
}

res

解决方案2:

我们应该继续产生不同的结果,并希望得到正确的答案。但是,为了减少时间,我们必须将随机数四舍五入1位数:

while(T){
  res<-round(runif(7,-1,1), digits = 1)
  print(sum(res))
  if(sum(res)==1)

     break

  }

res

类似的解决方案,如Salman Lashkarara。你应该把数字四舍五入以找到解决办法

library(magrittr)

set.seed(42)
x <- 1

while(sum(x) != 0){
  x <- runif(7,-1,1) %>%
    round(3)
}

x
#> [1]  0.155  0.559 -0.335 -0.230 -0.490 -0.557  0.898
sum(x)
#> [1] 0

Created on 2018-09-16 by the [reprex package](http://reprex.tidyverse.org) (v0.2.0).
库(magrittr)
种子(42)
x[1]0.1550.559-0.335-0.230-0.490-0.557 0.898
总和(x)
#> [1] 0
由[reprex package]于2018年9月16日创建(http://reprex.tidyverse.org)(v0.2.0)。

您的总体想法可能受到描述中链接的答案的启发。标准问题是如何生成7个介于0和1之间的数字,并将它们相加到1。答案是:

diff(c(0, sort(runif(6, 0, 1)), 1))
#> [1] 0.27960792 0.02035231 0.02638626 0.09945877 0.25134002 0.03379598 0.28905874
获得-1和1之间的数字所需的修改非常简单;只需省去排序:

diff(c(0, runif(6, 0, 1), 1))
#> [1]  0.9961661 -0.6528227  0.5298829 -0.2087127 -0.2298045  0.2017705  0.3635203
这是怎么回事?我们再次将空间划分为0和1之间。但是b不考虑排序,我们考虑了向后的可能性,即负数是可能的。以下是1000代人的柱状图:

这种方法的一个缺点是,第一个和最后一个数字必然是正的。如果这让您感到困扰,您可以添加额外的
示例
,例如:

sample(diff(c(0, runif(6, 0, 1), 1)), 7)
#> [1] -0.004242793 -0.725348335  0.385971491  0.320525822  0.389915347
#> [6]  0.053195271  0.579983197

仅供参考:如果你需要7个总是和1相加的随机数,那么你会得到6个随机数和1个相依数。这是真的吗?你说第一个和最后一个随机数很大是个问题。。。当您进行
排序时,最低值(最负)与0的距离最远,因此当您进行
差异(c(0,排序(…),1))
时,第一个值总是相对较大的差异。也许你的意思是
diff(c(-1,…,1))
?@r2evans是的,我知道这是个问题,但如果我接受它,我如何得到sum=1@user2428538我会很感激,如果你接受我的答案。用户2428 538,考虑,因为它是更快和更简单(imHo)。我只是尝试它,但它需要大量的时间,不工作在你的代码。我猜问题是总和。(res)可能大于1@user2428538我的第二个解决方案现在也起作用了。但现在的问题是一个小于-1的数字。我需要7个小于1且大于1的数字-1@user2428538第一个答案也是固定的,但是这个想法在某种程度上接近第二个答案。到目前为止,这是一个更好的答案,在数学上更严格,性能也更好t、 不需要迭代。谢谢你的回答。但问题是随机数应该都是正数。因此,我需要7个随机数下注0,1,其中和=1,所有数字都>0,并且,我还需要另外7个随机数下注-1,1,其中第二种情况下的和=0,数字可以是正数或负数negetive@user2428538嗯,我知道我们用第一行代码传递第一个变体。对于第二个变体,只需将最后一行代码中的最后一个
1
替换为
0
diff(c(0, runif(6, 0, 1), 1))
#> [1]  0.9961661 -0.6528227  0.5298829 -0.2087127 -0.2298045  0.2017705  0.3635203
sample(diff(c(0, runif(6, 0, 1), 1)), 7)
#> [1] -0.004242793 -0.725348335  0.385971491  0.320525822  0.389915347
#> [6]  0.053195271  0.579983197