假设我们现在要在集合 { 0 , 1 , 2 , ⋯ , n − 1 } \{0,1,2,\cdots,n-1\} {0,1,2,⋯,n−1}中随机抽取 k k k个数( k ≤ n k\le n k≤n)。显然每个元素被抽中的概率均为 k n \frac{k}{n} nk​。C++代码如下:

vector<int> sample_integers(int n, int k = 3)// 在{0, 1, 2, ..., n - 1}中等可能地抽取k个元素
{vector<int> result;int i = 0;for(; n > 0; ++i, --n){if(gen() % n < k) // 这个i被选中的几率是k/n{--k;result.push_back(i);}}return result;
}

时间复杂度为 O ( n ) O(n) O(n)。要理解这种算法的正确性,我们只需证明每个元素被抽中的几率都是 k n \frac{k}{n} nk​。又因为数学归纳法,我们只需证明第一个元素被抽中的概率等于后面的元素被抽中的概率。

显然,抽中第一个元素 0 0 0的概率是 k n \frac{k}{n} nk​。如果第一个元素被抽中了,那么后面的每个元素被抽中的概率是 k − 1 n − 1 \frac{k-1}{n-1} n−1k−1​;如果第一个元素没有被抽中,后面的每个元素被抽中的概率是 k n − 1 \frac{k}{n-1} n−1k​。根据全概率公式,后面的每个元素被抽中的概率是 P { 后面的某个被抽中抽 } = P { 后面的某个被抽中抽 ∣ 第一个元素被抽中 } P { 第一个元素被抽中 } + P { 后面的某个被抽中抽 ∣ 第一个元素没有被抽中 } P { 第一个元素没有被抽中 } = k − 1 n − 1 k n + k n − 1 n − k k = k n − 1 k − 1 n + k n − 1 n − k n = k n − 1 ( k − 1 n + n − k n ) = k n − 1 n − 1 n = k n \begin{aligned} P\{\text{后面的某个被抽中抽}\}&=P\{\text{后面的某个被抽中抽}|\text{第一个元素被抽中}\}P\{\text{第一个元素被抽中}\}\\&\qquad+P\{\text{后面的某个被抽中抽}|\text{第一个元素没有被抽中}\}P\{\text{第一个元素没有被抽中}\}\\ &=\frac{k-1}{n-1}\frac{k}{n}+\frac{k}{n-1}\frac{n-k}{k}\\ &=\frac{k}{n-1}\frac{k-1}{n}+\frac{k}{n-1}\frac{n-k}{n}\\ &=\frac{k}{n-1}\left(\frac{k-1}{n}+\frac{n-k}{n}\right)\\ &=\frac{k}{n-1}\frac{n-1}{n}\\ &=\frac{k}{n} \end{aligned} P{后面的某个被抽中抽}​=P{后面的某个被抽中抽∣第一个元素被抽中}P{第一个元素被抽中}+P{后面的某个被抽中抽∣第一个元素没有被抽中}P{第一个元素没有被抽中}=n−1k−1​nk​+n−1k​kn−k​=n−1k​nk−1​+n−1k​nn−k​=n−1k​(nk−1​+nn−k​)=n−1k​nn−1​=nk​​这样就证明了抽中每个元素的概率均为 k n \frac{k}{n} nk​。

【概率论】一种非常巧妙的随机抽样算法相关推荐

  1. 人工智能、模式识别领域最终是否会被一种本质、通用的算法主导?

    我是做编程和音频信号处理的,从去年开始因为工作的关系接触了一些人工智能的算法,对此很感兴趣,但时间不允许都没有深入了解,只是泛泛地了解了一下.有个问题是为什么这个领域存在如此多的原理不同的算法? 举个 ...

  2. 蝙蝠算法c语言,一种新颖的群智能算法:飞蛾扑火优化算法

    李志明+莫愿斌+张森 摘要 飞蛾扑火优化(MFO)算法是一种新颖的群智能优化算法,该算法的主要灵感来源于飞蛾在自然界中被称为横向定位的飞行方式.作为一种新提出的仿生群智能优化算法,分析了飞蛾扑火优化算 ...

  3. 50种方法巧妙优化SQL Server数据库(转载)

    50种方法巧妙优化SQL Server数据库 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3. ...

  4. RAFT 寻找一种易于理解的一致性算法(扩展版)

    摘要 Raft 是一种为了管理复制日志的一致性算法.它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统.为了提 ...

  5. 【面试锦囊】14种模式搞定面试算法编程题(8-14)

    面试锦囊之知识整理系列 面试锦囊系列一直有收到大家的反馈,包括后台内推成功的消息.朋友的同事从创业小公司成功跳到huawei等等,非常高兴小破号的这些整理分享能够真正地帮助到大家,以后也会继续.为了更 ...

  6. Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。

    Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说, ...

  7. 详解4种经典的限流算法

    最近,我们的业务系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法实现的,而令牌桶是非常经典的限流算法.本文将跟大家一起学习几种经典的限流算法. 限流是什么? 维基百科的概念如下 ...

  8. 6种常见的地标识别算法整理和总结

    本文分享自华为云社区<地标识别算法>,原文作者:阿杜 . 地标识别,基于深度学习及大规模图像训练,支持上千种物体识别及场景识别,广泛应用于拍照识图.幼教科普.图片分类等场景.本文将为大家带 ...

  9. 一种中文字符串相似度算法

    一种中文字符串相似度算法 概要 标记距离相似算法 扩展 概要 给定一个字符串a,在字符串列表B中找到与a最相似字符串b,或者让列表B按与a相似度排序.本文提出一种算法来较好的解决这个问题.并且该算法很 ...

最新文章

  1. windows10 计算器无法打开(转)
  2. 更改git bash默认的路径
  3. ionic4 select 去掉确定取消按钮_word文档中的水印如何去掉,有三种方法,你最喜欢哪种?...
  4. troch3d open3d例子
  5. 使用nio多线程下载网络文件实例
  6. Struts2与Servlet之间的关系
  7. 19-Harris角点检测
  8. 30096大学计算机应用基础,300道计算机应用基础试题(附答案)
  9. visio 2013安装教程
  10. macOS VSCode 终端使用powerline字体配置
  11. 如何减小电压跟随器输出电阻_运算放大器和比较器还傻傻分不清楚?一篇图文教你轻松辨认...
  12. python八卦图时钟代码-Python检测一个对象是否为字符串类的方法
  13. python连连看小游戏_python之自动化连连看脚本-第一关不动-小记
  14. JAVA博雅楼自习室预约系统计算机毕业设计Mybatis+系统+数据库+调试部署
  15. 华为交换机根据已知一个IP查他对应的MAC地址和交换机端口命令
  16. python中sinxcosy_∫e^x[(1-cosy)dx-(y-siny)dy],其中c为区域 0≤x≤π,0≤y≤sinx的边界曲线取正向.求曲...
  17. Explore Image Deblurring via Encoded Blur Kernel Space
  18. 1.产品/数据产品设计
  19. 一行代码用表情包制作炫酷二维码,详细教程奉上,包学会
  20. win10/win11 + WSL + gui 配置教程

热门文章

  1. Excel文件格式和扩展名不匹配
  2. 关于北大中文系应用语言学(上):更多有趣的汉语语法现象
  3. Java到底好不好学
  4. 学python和java哪个难?,java和python哪个难学
  5. 2022电大国家开放大学网上形考任务-建筑工程项目管理非免费(非答案)
  6. MATLAB连接USRP
  7. 5大模块带你了解视频后台设计(含推荐策略)
  8. 如何编写接口测试用例
  9. 基于51单片机信号发生器仿真设计
  10. 打开苹果电脑浏览器的代码