You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中生成每行和为100的随机百分比矩阵?

在R中生成每行和为100的非负整数矩阵

方法1:用rmultinom直接生成(推荐)

这是最简洁高效的方式,直接生成符合要求的矩阵,所有元素都是非负整数,且每行和严格为100:

set.seed(42)
# 生成100行、11列的矩阵,每行和为100
ranMat <- t(rmultinom(n = 100, size = 100, prob = rep(1/11, 11)))
  • 参数说明:
    • n = 100:生成100组样本(对应矩阵的100行)
    • size = 100:每组样本的总和为100
    • prob = rep(1/11, 11):每个列的概率权重相等,保证各列数值分布均匀;如果需要某几列数值偏大/偏小,可调整权重(比如prob = c(0.2, rep(0.8/10, 10))让第一列权重更高)
  • 验证行和:执行rowSums(ranMat),结果全为100

方法2:基于已有随机矩阵调整

如果你想保留原始sample(0:100)生成的数值分布特征,可以先生成随机矩阵,再归一化调整到每行和为100:

set.seed(42)
# 先生成100行11列的原始随机矩阵
ranMat <- matrix(sample(0:100, 1100, replace = TRUE), ncol = 11)

# 归一化并调整到和为100
row_sums <- rowSums(ranMat)
# 先按比例缩放后取整
ranMat_scaled <- floor(ranMat / row_sums * 100)
# 计算每行与100的差值
diff <- 100 - rowSums(ranMat_scaled)
# 随机给每行的diff个元素加1,补全到100
for (i in 1:nrow(ranMat_scaled)) {
  if (diff[i] > 0) {
    ranMat_scaled[i, sample(1:11, diff[i])] <- ranMat_scaled[i, sample(1:11, diff[i])] + 1
  }
}
  • 验证行和:执行rowSums(ranMat_scaled),结果全为100
  • 这种方法保留了原始随机数的波动特征,适合需要贴近真实数据分布的场景

内容的提问来源于stack exchange,提问作者The_Tams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:45:28