我想在R软件中生成一个矩阵(4行和30列),带有随机元素,按0到1之间的元素范围,每行的总和等于1.
答案 0 :(得分:3)
这是基于softmax(多项logit)变换的解决方案。
m <- matrix(rnorm(4 * 30), nrow=30)
prob <- exp(m)/rowSums(exp(m))
rowSums(prob)
#[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
all(prob > 0 & prob < 1)
#[1] TRUE
答案 1 :(得分:1)
如果您在[0,1]中选择n
个数字总和为1,则实际上选择了n-1
个断点。您可以选择断点,然后向后搜索数字:
rand.sum <- function(n){
x <- sort(runif(n-1))
c(x,1) - c(0,x)
}
然后
t(replicate(4,rand.sum(30)))
将是一个4x30的随机数矩阵,其中eaxch行总和为1。