当前位置: 首页 > news >正文

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

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

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} n1k1;如果第一个元素没有被抽中,后面的每个元素被抽中的概率是 k n − 1 \frac{k}{n-1} n1k。根据全概率公式,后面的每个元素被抽中的概率是 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{第一个元素没有被抽中}=n1k1nk+n1kknk=n1knk1+n1knnk=n1k(nk1+nnk)=n1knn1=nk这样就证明了抽中每个元素的概率均为 k n \frac{k}{n} nk

相关文章:

  • 做标书分享网站/北京快速优化排名
  • wordpress 判断是否页面/百度投票人气排行榜入口
  • 保定市住房和城乡建设厅网站/seo外包公司
  • 基于django的电子商务网站设计/网站点击排名优化
  • 域名注册网站建设网络实名/谷歌chrome官网
  • 新乡定制网站建设公司/棋牌软件制作开发多少钱
  • 【C语言进阶】文件操作详解
  • Jenkins插件及配置如何迁移与备份(不依赖控制台及插件)
  • W13Scan 扫描器挖掘漏洞实践
  • aws parallelcluster 理解 parallelcluster 集群的配置和使用
  • rabbitmq+netcore6 【6】RPC:远程过程调用
  • VMware 已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作的解决方法
  • vulnhub DC系列 DC-7
  • 【LeetCode】Day200-句子相似性 III
  • Python爬虫403错误的解决方案
  • 数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 ( 七)求两个数的差值
  • Vue的依赖收集和性能问题
  • WebStorage之浏览器的本地存储(结合案例)