R语言技术求助:计算多供应商组件随机抽样时各供应商至少1个被检测的概率
计算抽取组件时每个供应商至少1个的概率(R实现方案)
首先我们先理清问题的数学逻辑,再一步步完善你的R代码:
一、数学推导(精确概率)
总共有 (5+3+2=10) 个组件,随机抽取3个的总可能组合数是组合数 (C(10,3))。
要满足每个供应商至少1个组件被选中,由于总共抽3个,只能是A、B、C各抽1个(其他拆分方式比如2+1+0都不符合"每个至少1个"的要求)。这种情况的组合数是 (C(5,1) \times C(3,1) \times C(2,1))。
所以概率公式为:
[
P = \frac{C(5,1) \times C(3,1) \times C(2,1)}{C(10,3)}
]
二、R代码实现
1. 精确计算(用组合数直接求解)
在R中可以用choose()函数直接计算组合数:
# 计算满足条件的组合数 valid_combinations <- choose(5,1) * choose(3,1) * choose(2,1) # 计算总组合数 total_combinations <- choose(10,3) # 计算概率 probability <- valid_combinations / total_combinations # 输出结果 cat("精确概率为:", probability, "\n")
运行这段代码会得到精确的概率值(结果是 (30/120 = 0.25))。
2. 模拟计算(蒙特卡洛方法,验证结果)
如果你想用抽样模拟的方式验证结果,可以修改你原来的函数,让它每次抽样后检查是否包含A、B、C三种组件,然后重复大量次数计算比例:
# 定义单次抽样并判断是否符合条件的函数 check_valid_sample <- function() { # 抽样3个(无放回) sample_result <- sample(c(rep('A',5), rep('B',3), rep('C',2)), 3, replace = FALSE) # 检查是否包含A、B、C三种 all(c('A', 'B', 'C') %in% sample_result) } # 重复抽样10万次(次数越多结果越接近精确值) n_simulations <- 100000 # 统计符合条件的次数 valid_count <- sum(replicate(n_simulations, check_valid_sample())) # 计算模拟概率 simulated_prob <- valid_count / n_simulations # 输出结果 cat("模拟概率为:", simulated_prob, "\n")
三、你的原代码问题说明
你原来写的bin()函数只是返回抽样结果的长度(永远是3),没有做任何条件判断,所以无法统计符合要求的情况。修改后的函数添加了all(c('A','B','C') %in% sample_result)这个判断,用来检查抽样结果是否包含三个供应商的组件,这样才能统计有效样本的比例。
内容的提问来源于stack exchange,提问作者Abdulrazzaq
相关产品推荐
相关产品推荐

