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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:22:46