r - 生成 N 个总和为 1 的均匀随机数

标签 r random

我正在尝试生成 [0.005, 0.008] 范围内的 100 个均匀随机数,总和为 1。我正在寻找与我的担忧相关的几个问题,但我没有找到答案。 有人可以给我建议吗?

最佳答案

首先,我将稍微修改您的示例,假设 100 个变量以 [0.008, 0.012] 为界,并且它们的总和为 1(这确保您正在采样的集合中有可行点)。

"hit and run" algorithm在 n 维空间的有界子集上均匀采样。对于您的情况,我们有 n=100 维;让我们定义相应的变量x_1, x_2, ..., x_100。然后我们有三种类型的约束来限制我们想要采样的空间区域。

变量的下限为 0.008——这可以通过以下线性不等式来捕获:

x_1 >= 0.008
x_2 >= 0.008
...
x_100 >= 0.008

变量的上限为 0.012——这可以通过以下线性不等式来捕获:

x_1 <= 0.012
x_2 <= 0.012
...
x_100 <= 0.012

变量总和为 1——这可以通过以下方式捕获:

x_1 + x_2 + ... + x_100 = 1

假设我们想要获得 10 组均匀分布在我们的空间内的变量。然后我们可以通过以下方式使用 R 中的 hitandrun 包:

library(hitandrun)
n <- 100
lower <- 0.008
upper <- 0.012
s <- 1
constr <- list(constr = rbind(-diag(n), diag(n), rep(1, n), rep(-1, n)),
               dir = rep("<=", 2*n+2),
               rhs = c(rep(-lower, n), rep(upper, n), s, -s))
samples <- hitandrun(constr, n.samples=10)
dim(samples)
# [1]  10 100

请注意,这需要相当长的时间才能运行(在我的例子中略少于 2 小时),因为我们在高维空间(维度 n=100)中进行采样,并且为了确保命中并运行算法的均匀采样实际上对其绘制的每个样本执行 O(n^3) 次迭代。您可以通过调整函数的 thin 参数来减少运行时间,但这可能会影响绘图的独立性。

关于r - 生成 N 个总和为 1 的均匀随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829457/

相关文章:

r - 在dplyr中按组查找最接近x的值

r - 如何在不使用科学记数法的情况下在R数据框中显示数字列('e+07')

javascript - 如何在纯 JavaScript(不是 Node.js)中生成一个范围内的随机 BigInt?

php - 从数组 php 中获取随机值的子集

r - 我不明白函数内的错误 "object not found"

r - 向 autoplot.lm 添加通用标题

java - 用随机数填充 double 组,然后打印该数组中的偶数和奇数

python - 播放.wav文件x秒

javascript - 从数组 Javascript 生成随机元素组

r - 循环以包含不同的文件夹和模式