题 目:

如何等概率地从n个数中随机抽出m个数?

上题中如果n的大小不确定(可以认为是⼀个数据流),如何做?

方法:

蓄水池抽样

具体方法:我们先选取前m个数放入池中,然后我们每次以m/k的概率选择第k(k>m)个数a[k],然后再在蓄水池中随机选取一个元素a[j],交换a[k]和a[j];

Init : a reservoir with the size: m  for    i= m+1 to N    j=random(1, i);    if( j < m)    SWAP the jth value and ith value    end for   

假设当前是i+1, 按照我们的规定,i+1这个元素被选中的概率是m/(i+1),也即第 i+1 这个元素在蓄水池中出现的概率是m/(i+1) 
此时考虑前i个元素,如果前i个元素出现在蓄水池中的概率都是m/(i+1)的话,说明我们的算法是没有问题的。

证明(归纳法):
m < i <=N 
1.当i=m+1的时候,蓄水池的容量为m,第m+1个元素被选择的概率明显为m/(m+1), 此时前m个元素出现在蓄水池的概率为 m/(m+1), 很明显结论成立。 (因为第m+1个元素被选择的概率为m/(m+1),前m个元素有一个被选择到的概率是1/m,那么前m元素中的任意一个被替换掉的概率是m/(m+1) * 1/m= 1/(m+1),任意一个不被替换的概率是 1- 1/(m+1)=m/(m+1),即前m个元素任意一个还能出现在蓄水池的概率是m/(m+1)。)

2.假设当 j=i 的时候结论成立,此时以 m/i 的概率来选择第i个元素,前i-1个元素出现在蓄水池的概率都为m/i。 
证明当j=i+1的情况: 
即需要证明当以 m/(i+1) 的概率来选择第i+1个元素的时候,此时前i个元素任一个出现在蓄水池的概率都为m/(i+1)。 
前i个元素出现在蓄水池的概率有2部分组成, ①在第i+1次选择前得出现在蓄水池中; ②得保证第i+1次选择的时候不被替换掉 
①.由2知道在第i+1次选择前,任一前i个元素出现在蓄水池的概率都为m/i 
②.考虑被替换的概率: 
首先第 i+1 个元素被选中概率为 m/(i+1),其次是因为随机替换的池子中m个元素中任意一个,所以不幸被替换的概率是 1/m,故 前i个元素(池中元素)中任一被替换的概率 = m/(i+1) * 1/m = 1/(i+1),则池中元素没有被替换的概率为: 1 - 1/(i+1) = i/(i+1)
综合① ②,通过乘法规则 ① *②,
得到前i个元素出现在蓄水池的概率为 m/i * i/(i+1) = m/(i+1) 
故证明成立

如何等概率地从n个数中随机抽出m个数?相关推荐

  1. 从M个数中随机等可能的取出N个的问题

    从0到m-1这m个数中随机取出n个(n<=m) 要求每个数被取到的可能性相等.  第一个方法是把这m个数丢到一个List里面 然后用nextInt(list.size())来产生随机数 然后把l ...

  2. 算法-从1,...,99,2015这100个数中任意选择若干个数(可能为0个数)求异或,试求异或的期望值

    题目: 从1,2,3,-..98,99,2015这100个数中任意选择若干个数(可能为0个数)求异或,试求异或的期望值. 解题思路: 这是阿里巴巴的一道笔试题目,这并不是一道编程类的题目(虽然可以用编 ...

  3. MATLAB 在一个数组中随机选择n个数

    MATLAB 中在一个数组内随机选择n个数. 例如:在 A = [10, 50, 80, 100, 130, 260] 中随机选择5个数. 允许重复: n = 5; A = [10, 50, 80, ...

  4. c语言随机生成n个数求最小值,C语言程序:从N个数中随机取出100个不同的数

    /**你题目中的N个数至少得大于100吧.下面的程序N个数是随机生成 你的N个数是?同时这个程序有错误的话请告诉我. */ /* *从N个数中随机取出100个不同的数 *@author:banxi19 ...

  5. 请从1到35之间随机选择5个数,再从1到12中随机选择两个数,作为双色球的开奖号码...

    好的,我来随机选择双色球的开奖号码.根据您的要求,在1到35之间随机选择5个数,再从1到12中随机选择2个数,得到的开奖号码是:16, 5, 22, 31, 29,红球为8,蓝球为11.请注意,这只是 ...

  6. Java 随机数练习之从26个英文字母(含大小写)和 0 - 9 数字中随机抽出4个字符,然后拼接成一个随机验证码

    从26个英文字母(含大小写)和 0 - 9 数字中随机抽出4个字符,然后拼接成一个随机验证码 判断输入的验证码 与 随机生成的验证码 是否相同(忽略大小写) 如果正确,则系统提示,"恭喜你验 ...

  7. 从n个数中随机选取m个

    咋一看,这是个很简单的问题,但是如果n是个不确定的数呢?比如服务器每天会收到数以亿计的请求,但是目前服务器端不希望保存所有的请求,只想随机保存这些请求中的m个.试设计一种算法,能够使服务器实时保存m个 ...

  8. c# 从一组数中随机抽取一定个数_Python随机模块22个函数详解

    随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性.平时数据分析各种分布的数据构造也会用到. random模块,用于生成伪随机数,之所以称之为伪随机数, ...

  9. 从10W个数中随机抽走2个数,求出那两个数是多少

    这道题目是从51js论坛上看到的,链接在这里>> 题目大意是: 从1到10w(共10w个数)中随机抽走2个数,然后打乱剩下的数的顺序,问如果从这剩下的数中快速的找出抽走的是哪2个数? 我想 ...

最新文章

  1. 语义分割该如何走下去?
  2. 如何在Eclipse中构建APK文件?
  3. 每个程序员都应该知道的8个Linux命令
  4. java安全管理器视频_java安全-安全管理器
  5. Linux 下shell编程
  6. Go 语言学习总结(5)—— Go 学习笔记总结
  7. 数据预处理与特征工程—6.Kaggle房价预测中数据预处理与特征工程
  8. NLP学习01--BP神经网络
  9. Unity3D调用外部程序
  10. Hadoop_MapperContextInputSplitFileSplit源码浅析
  11. 删除word文档中的空白页
  12. 普通话和英语发音_incomplete
  13. 加州大学戴维斯计算机博士生,2020年加州大学戴维斯分校博士读几年
  14. 嘛:如何远视 还有遥远的未来
  15. Android Switch驱动的耳机检测
  16. 1230k倍区间,关于cnt[0]赋值为1的解释
  17. 计算机品牌企业关系图,AJ71C24-S3 画出PLC的I/O点与输入/输出设备的连接图或对应关系表, 三菱AJ71C24-S3 - 广州凌控...
  18. 基于马尔科夫链的股市大盘指数预测
  19. mima.php密码找回,蝉知系统忘记后台管理员密码怎么办?
  20. PCL 三维 CAD 模型 (obj、ply) 转点云 pcd 文件格式

热门文章

  1. DSIN 深度 Session 兴趣网络介绍及源码剖析
  2. 深入浅出matplotlib(38):动画显示与MP4视频输出
  3. 基于ARM的嵌入式无线视频监控系统
  4. 【CV-Learning】计算机视觉简介
  5. python升级pip版本
  6. 如何理解计算机网络中信道的码分复用?
  7. RPR技术介绍-ielab
  8. 对接wayfair API
  9. 运动模糊的图像修复调研
  10. 【Linux】SIGCHLD信号解决僵尸进程问题