zoukankan      html  css  js  c++  java
  • 利用欧拉计划学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);
    
  • 相关阅读:
    多表查询+多对多 三表连查+子查询
    几个重要的关键字where+group by +having +order by + limit
    拷贝表 *** 与******
    一对一关系的补充
    几种基本的约束和外键(一对一 多对多 多对一)级联关系
    创建表的完整语法 数字类型(整型 浮点型) 字符型 时间和日期类型 集合和枚举类型
    随记Litter note
    视图 触发器 事务(重要) 存储过程 内置函数 流程控制 索引
    luogu P2774 方格取数问题
    luogu P4014 分配问题
  • 原文地址:https://www.cnblogs.com/speeding/p/12587277.html
Copyright © 2011-2022 走看看