利用欧拉计划学Rust编程(第493题)
问题描述:
在容器中装有70个球,分别染上彩虹的七种颜色,每种颜色各有10个。
从容器中随机取出20个球,这些球中出现不同颜色球的数量的期望值是多少?
你的答案应当保留到小数点后9位小数(a.bcdefghij)。
第一步:模拟选球的过程
先模拟从70个球里选20个球的过程,可以大概一个大概的数值,虽然难于精确到小数点后9位,但可以给出一个粗略的估计。
假设70个球的编号是0到69,颜色编号从0到6,每10个一种颜色,x/10则可以表示球的颜色编号。rand模块中有一个sample_iter()函数可以完成从70个球里选20个球的过程,itertools里的unique()函数可以统计出不重复的颜色值。
模拟一百万次,可以得到大约为6.818的结果。
use rand::{seq, thread_rng, Rng};
use itertools::Itertools;
fn simulate() {
let mut rng = thread_rng();
let total_samples = 1_000_000_u64;
let mut sum = 0;
for _i in 0..total_samples {
let balls20 = seq::sample_iter(&mut rng, 0..70, 20).unwrap();
let distinct_colors = balls20
.into_iter()
.map(|x| x / 10)
.unique()
.collect::<Vec<u32>>();
//println!("{:?}", distinct_colors);
sum += distinct_colors.len();
}
println!("{}", (sum as f64) / (total_samples as f64));
}
第二步:利用概率论的知识
原问题等价于:20个球里出现至少1个红球的概率 + 至少1个绿球的概率 + ... + 至少1个紫球的概率。
由于出现红、绿、...、紫7种颜色球的概率是一样的,所以问题又等价于:
7 * {20个球里出现至少1个红球的概率}
7 * (1 – {20个球里没有出现1个红球的概率})
7 * (1 – {20个球里没有红球出现的所有可能组合} / {70个球里选20个球的所有可能组合})
没有红球出现,即从70个球里除掉10个红球,还有60个其它颜色的球,从里面选20个的情况共有 C(60, 20)种,所以得到:
现在用计算器也可以得到正确答案。
let mut prob = 1.0;
for i in 41..=50 {
prob *= (i as f64) / ((i + 20) as f64);
}
println!("{:.9}", (1.0 - prob) * 7.0);
----==== Email: slofslb (GTD) qq.com 请将(GTD)换成@ ====----
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者:申龙斌的程序人生
---- 魔方、桥牌、象棋、游戏人生...
---- BASIC、C++、JAVA、C#、Haskell、Objective-C、Open Inventor、程序人生...
---- GTD伴我实现人生目标
---- 区块链生存训练
---- 用欧拉计划学Rust编程
---- 申龙斌的读书笔记(2011-2019)
----

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2012-03-28 桥牌笔记:让敌方的Q、J、10、X只拿一墩的打法