`
美丽的小岛
  • 浏览: 300925 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

单遍历取等概率随机数问题

阅读更多

 问题描述:

假设我们有一堆数据(可能在一个链表里,也可能在文件里),数量未知。要求只遍历一次这些数据,随机选取其中的一个元素,任何一个元素被选到的概率相等。O(n)时间,O(1)辅助空间(n是数据总数,但事先不知道)。

 

引例:

5个人抽5个签,只有一个签意味着“中签”,轮流抽签,从很久很久以前我们就认为这个是非常公平的例子,这个应该不用去怀疑吧。如果怀疑了,好吧,看下面的分析:

分析:

设Ai为第i个人抽签抽中事件,P(Ai)表示第i个人中签的概念,依题意得:

第一个人中签概率:P(A1)=1/5;

第二个人中签概率:P(A2)=4/5*1/4=1/5;(因为第二个人是在第一个人选了之后才去抽的,所以,还有4/5是第一个没有选中的,剩下的四个再去抽一个所以是1/4)

同理, P(A3)=4/5*3/4*1/3=1/5; 

P(A4)=4/5*3/4*2/3*1/2=1/5; 

P(A3)=4/5*3/4*2/3*1/2*1=1/5;

就样,五个人抽到的是等概率的,相信了吧。

 

总结公式:

 

java产生随机数的几种方式

1.使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,可以乘以一定的数,比如说乘以100,他就是个100以内的随机。(j2me没有)

2.在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以产生随机整数、随机float、随机double,随机long,这个也是我们在j2me的程序里经常用的一个取随机数的方法。
3.在我们的System类中有一个currentTimeMillis()方法,这个方法返回一个从1970年1月1号0点0分0秒到目前的一个毫秒数,返回类型是long,我们可以拿他作为一个随机数,我们可以拿他对一些数取模,就可以把他限制在一个范围之内。

一般会用到java.util里面包中的,一个例子:

public class Test {
	public static void main(String[] args) {
		java.util.Random r=new java.util.Random(); 
         for(int i=0;i<100;i++){ 
             System.out.println("i="+i+"  "+r.nextInt(100)); 
         } 
	}
}

结果打印了100个0到100(不包含100)的随机数。

看一下Random类:

还有nextFloat().nextLong()等方法,重点看看nextInt(int n)方法吧,看jdk说明文档。

 

参数:
n - 要返回的随机数的范围。必须为正数。
返回:
下一个伪随机数,在此随机数生成器序列中 0(包括)和 n(不包括)之间均匀分布的 int 值。
抛出:
IllegalArgumentException - 如果 n 不是正数

 

 

单遍历取等概率随机数问题求解JAVA实现:

 

public class Test {
	public static void main(String[] args) {
		java.util.Random r=new java.util.Random(); 
         int n= 0 ;
         int[] a = {12,34,56,78,9,91,87,4,5,62,12,3,41,8,89,541,11,54,36};
         int selectNum = 0 ;
        for(int k : a){
        	n++ ;
        	if(r.nextInt(n) == 0){
        		selectNum = k ;
        	}
        }
        System.out.println("selectNum:"+selectNum);
	}
}

 

参考:

http://www.gocalf.com/blog/random-selection.html

http://www.blogjava.net/cool2009/archive/2009/03/15/259882.html

  • 大小: 7.2 KB
分享到:
评论

相关推荐

    Canvas打造三重玩法转盘:等分不同概率转盘抽奖(3)

    本章为绘制等分不同概率转盘,完整代码供学习参考,扩展已详细进行注解。Canvas三重玩法请关注本专栏,不容错过呦,快来关注吧! 此次与均等分等概率转盘抽奖不同的事,每块概率出现均可控。 采取的方法是对const ...

    Canvas打造三重玩法转盘:不等分不同概率转盘抽奖(4)

    此次与均等分等概率转盘抽奖不同的事,每块概率出现均可控。 采取的方法是对const prizeProbabilities = [0.05, 0.05, 0.05, 0.05, 0.10, 0.2, 0.25, 0.25]; // 各个奖项的概率 进行map() 方法遍历将没数组内每一...

    计算机算法设计与分析试题.doc

    A 中序遍历 B 广度优先遍历 C 深度优先遍历 D 层次优先遍历 33、下列随机算法中运行时有时候成功有时候失败的是(C ) A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法 34.实现合并排序利用的算法是...

    基于C++实现的改进版遗传算法解决TSP问题源码+项目说明.zip

    - 随机数的生成:设置时间种子,并由此生成随机数 - 交叉对象的选择:轮盘赌 - 交叉算法的选择:顺序移位 - 变异算法的选择:顺序移位 / 贪婪倒位 - 参数的选择:由多次实验得出 # Feature - 种群自动扩增 - ...

    算法引论:一种创造性方法.[美]Udi Manber(带详细书签).pdf

    全书共分12章:第1章到第4章为介绍性内容,涉及数学归纳法、算法分析、数据结构等内容;第5章提出了与归纳证明进行类比的算法设计思想;第6章到第9章分别给出了4个领域的算法,如序列和集合的算法、图算法、几何算法...

    人工智能-遗传算法.pdf

    该函数值 即适应函数,就是衡量染⾊体对环境适应度的指标,也是反映实际问题的⽬标函数 基本的遗传操作 (1)选择(Select):按⼀定的概率从上代群体中选择M对个体作为双亲,直接拷贝到下⼀代,染⾊体不发⽣变化。...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    如果读者采用其他编程语言,例如C++、C#、VB、Java等,根据其语法格式进行适当的修改即可。 《C/C++常用算法手册 》主要定位于有一定C/C++语言编程基础、想通过学习算法与数据结构提升编程水平的读者,也可作为...

    LINGO软件的学习

    LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 §1 LINGO快速入门 当你在windows下开始运行...

    lu分解法matlab代码-lightspeed:LightspeedMatlab工具箱

    高效的随机数生成器 共同概率密度的评估 用于计算浮点运算(FLOPS)的例程,对基准测试算法很有用。 实用程序,例如文件名遍历和可变长度参数列表的解析。 图形功能,例如axis_pct和mobile_text (在graphics子目录...

    基于lf蚁群聚类算法

    %-- Unknown date --% else p(:,j)=0; end; if maxp(1)(1,j) maxp(1)=p(1,j); end;...linear_index=find(maxp(1)==p(1,:));...[r_index,c_index]=ind2sub(size1,linear_index(1));...solution_medium(k,1)=distance(g(NC,k),c...

    世界500强面试题.pdf

    1.5.6. 输入两个整数 n 和 m,从数列 1,2,3.......n 中 随意取几个数 ....... 116 1.5.7. 输入一个表示整数的字符串,把该字符串转换成整数并输出.............. 118 1.5.8. 给出一个数列,找出其中最长的单调...

Global site tag (gtag.js) - Google Analytics