如何编写Python代码计算不放回抽取2红3绿弹珠的概率?
模拟计算抽取2红3绿弹珠的概率
已知袋子中有10个红色弹珠(编号21-30)和20个绿色弹珠(编号1-20),采用不放回方式抽取5个弹珠,我们可以通过蒙特卡洛模拟来计算抽到2红3绿的概率。
原代码逻辑回顾
你提供的全同色概率计算代码,是通过给弹珠编号(1-20为绿,21-30为红),每次随机抽取5个编号后,判断是否全绿(所有编号≤20)或全红(所有编号>20),最后用符合条件的次数除以总试验次数得到概率。
修改后的代码(计算2红3绿概率)
我们只需要调整判断条件:统计每次抽取中红色弹珠(编号>20)的数量是否为2,即可对应2红3绿的情况:
import random random.seed(42) total = 0 trials = 10000 for _ in range(trials): draw = random.sample(range(1, 31), 5) # 统计红色弹珠数量(编号>20的个数) red_count = sum(1 for num in draw if num > 20) if red_count == 2: total += 1 print(total / trials)
代码说明
sum(1 for num in draw if num > 20):遍历抽取的5个编号,统计其中大于20的数量(即红色弹珠个数)- 判断
red_count == 2:如果红色弹珠恰好是2个,那么绿色弹珠必然是3个,符合我们要统计的情况 - 最终
total/trials就是模拟得到的概率
补充:精确数学计算(可选)
如果需要精确值,可以用组合数公式计算:
概率 = (C(10,2) * C(20,3)) / C(30,5)
其中:
C(n,k)表示从n个元素中选k个的组合数C(10,2)是选2个红弹珠的方式数,C(20,3)是选3个绿弹珠的方式数,C(30,5)是从30个弹珠中选5个的总方式数
内容的提问来源于stack exchange,提问作者user21160621
相关产品推荐
相关产品推荐

