博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(算法)等概率选出m个整数
阅读量:5236 次
发布时间:2019-06-14

本文共 935 字,大约阅读时间需要 3 分钟。

题目:

从大小为n的整数数组A中随机选出m个整数,要求每个元素被选中的概率相同。

思路:

n选m,等概率情况下,每个数被选中的概率为m/n。

方法:

初始化:从A中选择前m个元素作为初始数组;

随机选择:从第m个元素开始,依次遍历数组下标i,并通过随机生成器生成数字k(生成0~n),如果k<m,则将A[i]替换A[k]。

证明:

归纳法:假设数组A大小为n,需要选m个元素,每个元素被选中的概率为m/n。

对于初始化的m个元素而言,其选中的概率自然为m/n;

而对于第n+1个元素,该元素被选中的概率m/(n+1)(根据随机生成器),

而对于此时前m个元素,根据第n+1个元素的选中与否情况:

第n+1个没选中的概率为1-m/(n+1),则全部留下的可能性为P1:m/n*(1-m/n+1),

第n+1个被选中的概率为m/(n+1)有一个被替换后留下的可能性为P2:m/n*m/(n+1)*(m-1)/m,

总的留下概率为:P1+P2=m/(n+1)

因此得证。

代码:

#include
#include
#include
#include
using namespace std;void pickM(const vector
&A,int m,vector
&pick){ int n=A.size(); for(int i=0;i
>n>>m){ vector
A(n); for(int i=0;i
>A[i]; vector
pick; pickM(A,m,pick); for(int i=0;i

 

转载于:https://www.cnblogs.com/AndyJee/p/4908304.html

你可能感兴趣的文章
PAT——1035. 插入与归并
查看>>
JS 在元素后面添加新的元素
查看>>
One Night Ultimate Werewolf Daybreak
查看>>
downloadId = downloadId || "downloads"
查看>>
目标,执行,绩效
查看>>
微软Azure运营方世纪互联遭做空后强劲反弹
查看>>
根据经纬度算距离
查看>>
恋爱的心声
查看>>
git 服务器搭建与运用
查看>>
(组件、路由)懒加载
查看>>
数据库查询拼接
查看>>
《C++反汇编与逆向分析技术揭秘》之十——构造函数
查看>>
2018年学习的一门语言
查看>>
lightoj 1057 - Collecting Gold(状压dp)
查看>>
1401机器翻译(Noip2010提高组第1题)
查看>>
矢量图
查看>>
CSS--文本属性
查看>>
【二次元的CSS】—— 用 DIV + CSS3 画咸蛋超人(详解步骤)
查看>>
关于restful开发的疑惑
查看>>
笔记:html常见的兼容问题
查看>>