使用R,如何生成n个介于-11之间的随机数x_1,...,x_n,其和为0

那么推广到另一个和和另一个值域呢?

推荐答案

Update

遵循与前一个解决方案相同的递归思想,我们可以通过首先生成具有更多边界约束的r来避免repeat,这可能会加速很多,达到102

f <- function(s, n, a, b) {
  if (s < n * a || s > n * b) {
    stop("Invalid parameters.")
  }
  if (n == 1) {
    return(s)
  }
  r <- runif(1, max(a, s - (n - 1) * b), min(b, s - (n - 1) * a))
  c(r, Recall(s - r, n - 1, a, b))
}

我们可以看到

> (v <- f(s = 60, n = 30, a = 1, b = 3))
 [1] 1.544962 1.229845 2.013064 1.510149 2.933672 1.782947 1.650229 2.700521
 [9] 1.151468 1.758759 2.035019 1.355591 2.731922 2.918394 2.288166 2.198345
[17] 1.313646 2.312720 1.232810 1.591426 1.020105 2.788073 1.208734 2.929171
[25] 1.397976 2.044319 1.593190 2.961647 2.849886 2.953244

> summary(v)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
  1.002   1.387   2.126   2.000   2.585   2.892

> length(v)
[1] 30

> sum(v)
[1] 60

Previous

我想您可以try 下面这样的递归方法(我不认为我的方法是优化的,但只是给您一些提示)

一百零二

f <- function(s, n, a = 1, b = 2) {
  if (s < n * a || s > n * b) {
    stop("Invalid parameters.")
  }
  if (n == 1) {
    return(s)
  }
  repeat {
    r <- runif(1, a, b)
    if (s - r >= (n - 1) * a && s - r <= (n - 1) * b) break
  }
  c(r, f(s - r, n - 1))
}

这样,例如,用s= 25n = 20,我们可以获得

> (v <- f(s = 25, n = 20))
 [1] 1.901342 1.153576 1.280439 1.920860 1.401054 1.245442 1.227995 1.340637
 [9] 1.051620 1.958662 1.360496 1.001955 1.087513 1.006621 1.002153 1.008432
[17] 1.033762 1.004273 1.009684 1.003484

> length(v)
[1] 20

> sum(v)
[1] 25

R相关问答推荐

R:对于没有数据的缓冲区,加权平均值为0

按条件计算观察次数

在R中使用GG Plot时如何 suppress 等值线图中的彩色条

在值和NA的行顺序中寻找中断模式

计算R中的威布尔分布的EDF

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

更改编号列表的 colored颜色

矩阵%*%矩阵中的错误:需要数字/复杂矩阵/向量参数

pickerInput用于显示一条或多条geom_hline,这些线在图中具有不同 colored颜色

在组中添加值增加和减少的行

如何自定义3D散点图的图例顺序?

将. xlsx内容显示为HTML表

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

根据现有列的名称和字符串的存在进行变异以创建多个新列

用R ggplot2求上、下三角形中两个变量的矩阵热图

`夹心::vcovCL`不等于`AER::tobit`标准错误

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

长/纬点继续在堪萨斯-SF结束,整齐的人口普查

在R中使用ggraph包排列和着色圆