随机读取数据,如何保证真随机是不可能的,因为计算机的随机函数是伪随机的。

但是在不考虑计算机随机函数的情况下,如何保证数据的随机采样呢?

1.系统提供的shuffle函数

C++/Java都提供有shuffle函数,可以对容器内部的数据打乱,保持随机排序。

C++:

1 template

2 void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);

Java:

1 static void shuffle(List>list);2 static void shuffle(List> list, Random rnd);

这些函数对数量一定的数据的随机打乱顺序,并不能处理数量不定的数据流。

2.在序列流中取一个数,如何确保随机性,即取出某个数据的概率为:1/(已读取数据个数)

假设已经读取n个数,现在保留的数是Ax,取到Ax的概率为(1/n)。

对于第n+1个数An+1,以1/(n+1)的概率取An+1,否则仍然取Ax。依次类推,可以保证取到数据的随机性。

数学归纳法证明如下:

当n=1时,显然,取A1。取A1的概率为1/1。

假设当n=k时,取到的数据Ax。取Ax的概率为1/k。

当n=k+1时,以1/(k+1)的概率取An+1,否则仍然取Ax。

(1)如果取Ak+1,则概率为1/(k+1);

(2)如果仍然取Ax,则概率为(1/k)*(k/(k+1))=1/(k+1)

所以,对于之后的第n+1个数An+1,以1/(n+1)的概率取An+1,否则仍然取Ax。依次类推,可以保证取到数据的随机性。

代码如下:

1 //在序列流中取一个数,保证均匀,即取出数据的概率为:1/(已读取数据个数)

2 voidRandNum(){3 int res=0;4 int num=0;5 num=1;6 cin>>res;7

8 inttmp;9 while(cin>>tmp){10 if(rand()%(num+1)+1>num)11 res=tmp;12 num++;13 }14 cout<

3.在序列流中取k个数,如何确保随机性,即取出某个数据的概率为:k/(已读取数据个数)

建立一个数组,将序列流里的前k个数,保存在数组中。(也就是所谓的"蓄水池")

对于第n个数An,以k/n的概率取An并以1/k的概率随机替换“蓄水池”中的某个元素;否则“蓄水池”数组不变。依次类推,可以保证取到数据的随机性。

数学归纳法证明如下:

当n=k是,显然“蓄水池”中任何一个数都满足,保留这个数的概率为k/k。

假设当n=m(m>k)时,“蓄水池”中任何一个数都满足,保留这个数的概率为k/m。

当n=m+1时,以k/(m+1)的概率取An,并以1/k的概率,随机替换“蓄水池”中的某个元素,否则“蓄水池”数组不变。则数组中保留下来的数的概率为:

所以,对于第n个数An,以k/n的概率取An并以1/k的概率随机替换“蓄水池”中的某个元素;否则“蓄水池”数组不变。依次类推,可以保证取到数据的随机性。

代码如下:

1 //在序列流中取n个数,保证均匀,即取出数据的概率为:n/(已读取数据个数)

2 void RandKNum(intn){3 int *myarray=new int[n];4 for(int i=0;i>myarray[i];6

7 int tmp=0;8 int num=n;9 while(cin>>tmp){10 if(rand()%(num+1)+1

11 myarray[rand()%n]=tmp;12 }13

14 for(int i=0;i

随机抽样java_Reservoir Sampling 蓄水池抽样算法,经典抽样相关推荐

  1. Reservoir Sampling 蓄水池采样算法

    https://blog.csdn.net/huagong_adu/article/details/7619665 https://www.jianshu.com/p/63f6cf19923d htt ...

  2. 机器学习中的数学——蓄水池抽样算法(Reservoir Sampling Algorithm)

    分类目录:<机器学习中的数学>总目录 蓄水池抽样算法(Reservoir Sampling Algorithm)解决了未知长度数据的均匀抽样问题,即:给定一个数据流,数据流长度NNN很大, ...

  3. 图解连续学习中的蓄水池抽样算法(The Illustrated Reservoir sampling)

    图解连续学习中的蓄水池抽样算法The Illustrated Reservoir sampling 前言 什么是Reservoir Sampling? 蓄水池抽样算法(Reservoir sampli ...

  4. 蓄水池抽样算法(reservoir sampling)

    蓄水池抽样算法(reservoir sampling) 场景:在长度未知的数据流中,等概率地采样一定数量的数据.即,数据量N未知,若要求采样k个数据,采样概率保证kN\frac{k}{N}Nk​. 要 ...

  5. 蓄水池采样算法的python实现_蓄水池抽样算法(Reservoir Sampling)

    蓄水池抽样算法(Reservoir Sampling) 许多年以后,当听说蓄水池抽样算法时,邱simple将会想起,那个小学数学老师带他做"小明对水池边加水边放水,求何时能加满水" ...

  6. 蓄水池采样算法的python实现_常用算法-蓄水池抽样算法

    Leetcode上遇到一道题,题目是这样的: 这道题的关键是链表的长度不知道,但是要使随机返回每个元素的概率相等,这一下就难倒我了,如果知道链表的长度k,从0到k中随机选择一个整数就好了呀,可现在不知 ...

  7. LeetCode Random Pick Index(蓄水池抽样算法)

    问题:给出一个数组,存在相同的数,随机输出目标数所在的下标 思路:使用蓄水池抽样算法,当第一次找到目标数时,作为选取.接着如果随机数等于0,则选取.在遍历完后,直接返回选取的值 具体代码参考: htt ...

  8. 【大数据算法】蓄水池抽样算法

    一.题目来源: 这个题目的由来是周围有人讨论到去面试(某8)的时候遇到了这个问题.另外正好HIT有个视频也有这个内容,故记录一下: 二.题目描述:     该人面试的时候问的是: 如何从二进制文件中等 ...

  9. 水塘抽样算法(Reservoir Sampling Algorithm)

    文章目录 应用场景 算法步骤 算法原理 代码实现 应用场景 主要用于解决大数据流中的随机抽样问题,即:当内存有限,数据长度很大,甚至未知,那么如何从中随机选取k个数据,并且要求是等概率. 算法步骤 水 ...

最新文章

  1. Apache commons-io
  2. php把时间格式转换为时间戳,php如何将时间格式转换成时间戳?
  3. 指数型组织形成的 9 大驱动因素
  4. Pytorch Anaconda 安装CPU版本
  5. 一个深圳程序员被一美女骗到东莞迷強
  6. 某工程车零部件制造厂商
  7. 回归模型的score得分为负_逻辑回归评分卡实现和评估
  8. 观星(【CCF】NOI Online能力测试3 入门组)
  9. cmake笔记(1)
  10. DPM2012系列之十七:如何将备份文件恢复到网络共享文件夹
  11. mysql启动日志指令_简单整理MySQL的日志操作命令
  12. Mysql 日期函数 增加周天年月时分秒
  13. linux系统vi编辑器按esc没反应,关于ubuntu14.04版本vi编辑模式按下ESC无法回到一般模式的问题...
  14. 【Scratch案例实操】Scratch小狗散步 scratch编程案例教学 scratch创意编程 少儿编程教案
  15. BT601和BT709的区别最简洁的描述
  16. 【DCANet2022】DCANet: Differential Convolution Attention Network for RGB-D Semantic Segmentation
  17. 【小猿說】以小刀会“的成败论当今创业成败
  18. CF417D--- Cunning Gena(排序+状压dp)
  19. unity3D 鼠标点击游戏物体碰撞 (射线)
  20. 回味无穷:历史名人的幽默隽语[转自人民网]

热门文章

  1. Spring思维导图(MVC篇)
  2. Java项目打包部署war文件
  3. atitit. java jsoup html table的读取解析 总结
  4. java 二分查找
  5. Android中自定义Dialog外形,去除黑底和白色边框
  6. ASP的DES加密解密
  7. 宋君强 学科评估 计算机科学,三分钟,这个学院带你乘风破浪
  8. sqlite3数据存储最多存储多少条数据?达到上限如何处理?_在数据爆炸的当下,教你设计一个能实现9个9数据可靠性的存储系统...
  9. python生成时间戳_python生成13位或16位时间戳以及反向解析时间戳的实例
  10. php百度地图添加标记,JavaScript API - 自定义标注 | 百度地图API SDK