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

如何在R中生成满足特定占比要求的截断随机分布样本

简便实现方案(不限分布)

不用反复调整分布参数凑比例,直接通过分块生成就能精准满足需求,下面是几种简单的实现方式:

方法1:基础R原生实现(精准控制比例)

直接拆分样本量,分别生成对应区间的随机数,完全符合20%样本>50的要求,无需额外包:

n <- 300
p_above <- 0.2
threshold <- 50
lower <- 0
upper <- 150

# 拆分样本数量
n_below <- round(n * (1 - p_above))
n_above <- n - n_below

# 生成两部分样本:0-50区间取80%,50-150区间取20%
samples_below <- runif(n_below, min = lower, max = threshold)
samples_above <- runif(n_above, min = threshold, max = upper)

# 合并并打乱顺序
samples <- sample(c(samples_below, samples_above))

# 验证比例
sum(samples > threshold) / n

这种方法完全精准控制比例,取值范围严格在0-150,操作最简单。

方法2:自定义混合分布(可选带形态)

如果需要样本有一定分布形态(比如不是纯均匀),可以用不同的基础分布组合,比如给下方样本用截断正态,上方用均匀:

library(truncnorm)

n <- 300
p_above <- 0.2
threshold <- 50
lower <- 0
upper <- 150

n_below <- round(n * (1 - p_above))
n_above <- n - n_below

# 下方样本用0-50的截断正态,上方用50-150的均匀
samples_below <- rtruncnorm(n_below, a = lower, b = threshold, m = 25, sd = 10)
samples_above <- runif(n_above, min = threshold, max = upper)

samples <- sample(c(samples_below, samples_above))

sum(samples > threshold) / n

这种方法保留了部分分布形态,同时依然精准控制比例。

方法3:单次生成的自定义分布

如果想通过一次函数调用实现,可以用sample结合概率权重,配合区间映射:

n <- 300
p_above <- 0.2
threshold <- 50
lower <- 0
upper <- 150

# 先随机选择每个样本属于哪个区间,再生成对应值
group <- sample(c("below", "above"), size = n, replace = TRUE, prob = c(1 - p_above, p_above))
samples <- ifelse(group == "below", runif(n, lower, threshold), runif(n, threshold, upper))

sum(samples > threshold) / n

写法更简洁,同样能精准满足要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:42:50