随机取样算法
来源:互联网 发布:云计算的基础是什么 编辑:程序博客网 时间:2024/04/30 04:40
最近学习编程珠玑,看到随机取样算法,很不错,这里也整理下:
首先来看一个简单的取样算法,这里假定在不考虑重复的情况下,从1-N之间取出M个数来
void simpleRand(int m, int n){ for (int i = 0; i < m; i++) cout << rand() % n + 1 << " "; cout << endl;}这样子的话,很容易得到如下的输出:
这样子的话,倒是适合“石头-剪刀-布”,一类的小游戏
但很多情况下,我们需要的是没有重复的随机数,如何从1-N中取出M个数呢,这里看看如下的伪代码
initialize set S to empty
Size = 0
while Size < M do
T := RandInt(1, N)
if T is not in S then
insert T in S
Size := Size + 1
这个算法,很不错,由于集合存储不同数据,所以最终得到的随机样本中,没有重复数据,见代码
void simpleRand2(int m, int n){set<int> s;int size = 0;while (size < m){int t = rand() % n + 1;if (s.find(t) == s.end()){s.insert(t);size++;}}for (set<int>::iterator i = s.begin(); i != s.end(); ++i)cout << *i << " ";cout << endl; }
这一次,得出的结果已经很不错了
可惜,还是有一个重大问题,如果M = N = 100呢,当Size = 99时,最后一个数,算法只能闭眼瞎猜,直到偶然碰到那个数,这平均需要猜测100个随机数。
好了,不要着急,我们额度改良算法马上就来到了
这里利用递归很容易理解,如果从1-10中选择5个数,那么只需要从1-9中产生一个4个数的样本,然后再加上第五个数即可了:
这里给出伪代码参考了:
function Sample(M, N)
if M = 0 then
return the empty set
else
S := Sample(M - 1, N - 1)
T := RandInt(1, N)
if T is not in S then
insert T in S
else
insert N in S
return S
- 随机取样算法
- 随机取样和洗牌算法
- 取样(算法)
- 随机取样问题
- [读书笔记]随机取样
- 随机取样问题
- hive-随机取样
- 分析测试中的取样要求-随机取样
- 随机取样问题的实现
- 取样问题-获取随机样本
- 取样问题、洗牌算法
- 概率随机问题【2】 取样与概率
- 随机取样(《编程珠玑》第12章)
- 编程珠玑12章习题 12.9 FLoyd随机取样算法的证明(转自编程珠玑续)
- 随机化算法之取样问题
- 取样
- perl模板的应用:随机排序:随机不放回取样
- 等概率随机取样的c语言实现
- Linux的快捷键和主要命令
- struts2_4_为Action属性注入值
- HTML5 transform三维立方体(带旋转效果)
- 方格游戏
- U盘安装 CentOS 7
- 随机取样算法
- struts2_5_struts中常量的配置
- C++实现CString和string的互相转换
- Web GIS访问ArcGIS安全认证服务代理配置解决方案-IIS版本
- 235倍数 hdu1058加强版
- oracle更新及实物处理
- Linux系统命令及其使用详解
- 统计单词出现的最多次数(Trie树)
- 获取程序路径的方法