`
美丽的小岛
  • 浏览: 308315 次
  • 性别: 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
分享到:
评论

相关推荐

    一些算法(美丽的小岛)

    2. **单遍历取等概率随机数问题**:在一次遍历数组的过程中,如何有效地选取具有等概率的随机元素。这通常涉及到随机数生成和概率论,可能使用Fisher-Yates洗牌算法或其他方法。 3. **查找任意两个节点的公共父节点...

    随机数概率计算

    在IT领域,随机数和概率计算是至关重要的概念,尤其在模拟、统计分析、游戏开发、加密算法以及机器学习等多个方面都有广泛应用。本篇将详细探讨如何利用编程语言中的随机函数生成数字序列,并通过分析这些序列来理解...

    JAVA 根据设置的概率生成随机数的方法

    在 chanceSelect 方法中,我们首先计算总概率,然后生成一个随机数,然后遍历 Map,减去每个项的概率,直到随机数小于或等于 0,这时我们就选中了该项。这种方法可以根据预先设置的概率来生成随机数。 在实际应用中...

    matla路径规划城市遍历机器人路径等问题精讲:28 城市遍历问题(蚁群算法).zip

    城市遍历问题是一个经典的组合优化问题,常被用于路径规划,特别是在机器人导航、物流配送等领域。在本课程中,我们重点讨论的是如何利用MATLAB来解决这个问题,特别是通过应用蚁群算法来寻找最短路径。 蚁群算法是...

    python按概率生成随机数1

    在Python编程中,有时我们需要按照特定的概率来生成随机数,比如在模拟实验或者游戏中,不同事件发生的概率可能各不相同。本篇文章将介绍如何在Python中实现按概率生成随机数,以及一个具体的例子,用于模拟生成红、...

    标准正太随机数

    在计算机科学与统计学领域,生成符合特定概率分布的随机数对于模拟、实验设计以及数据分析等方面具有重要意义。其中,标准正态分布(均值为0,方差为1的正态分布)是一种非常重要的概率分布模型,在许多应用中被广泛...

    Random()随机数+随机切换图片

    `Random`类的构造函数通常不带参数,创建实例后,可以通过`nextInt()`、`nextDouble()`等方法来获取不同类型的随机数。例如: ```java Random random = new Random(); int randomInt = random.nextInt(); // 生成0...

    概率抽奖算法Demo(适应刮刮卡和轮盘类等抽奖).zip_DEMO_drawdemo抽奖_抽奖 概率_抽奖抽奖算法_抽奖算法

    通过遍历奖项,比较随机数与每个奖项的累计概率,当随机数小于某个累计概率时,选择该奖项。 4. **优化效率**:在处理大量奖项时,逐个比较累计概率可能会导致性能下降。因此,可以使用二分查找或者哈希映射等数据...

    js控制随机数生成概率代码实例

    在JavaScript编程中,有时我们需要根据特定的概率分布生成随机数,比如在游戏开发、模拟系统或数据分析等场景。本文将深入探讨如何使用JavaScript控制随机数生成概率,并提供一个具体的代码实例。 首先,我们要理解...

    36选7的开奖过程,每次从1到36的数中生成一个随机数

    总的来说,“36选7”开奖过程的实现涉及了随机数生成、概率公平性、数据结构(如列表)以及基本的循环和条件判断等编程概念。在实际编程中,还需要考虑性能优化和错误处理等细节。对于理解随机数生成、概率和算法...

    基于Python技术的自然图像随机数生成设计.zip

    总的来说,这个项目展示了Python在图像处理和随机数生成方面的强大能力,结合了计算机视觉和概率统计的知识,为实际应用提供了创新思路。通过学习和实践这个设计,开发者不仅可以掌握Python图像处理技巧,还能深入...

    VC 生成任意分布的随机数(示波器)演示

    在计算机科学和编程领域,随机数的生成是一个重要的任务,特别是在模拟、统计计算以及游戏开发等应用中。本文将深入探讨如何使用VC++(Visual C++)编程环境生成任意分布的随机数,以正态分布为例,同时结合“示波器...

    常见的抽奖-根据指定概率抽奖(改进)

    接着,生成一个介于0(包含)和总概率(不包含)之间的随机数,然后遍历奖项,通过比较随机数与每个奖项的累积概率来确定中奖项。 这个过程的关键在于如何高效地计算累积概率。一种方法是使用优先队列(如C#中的`...

    随机数的案例-洗牌程序.rar

    在编程领域,随机数的应用广泛且重要,尤其是在游戏开发、模拟仿真、加密算法等领域。C#作为.NET框架下的主要编程语言,提供了丰富的随机数生成工具。本案例——“随机数的案例-洗牌程序”旨在讲解如何利用C#实现一...

    c语言中的随机函数分析与生成m个不重复随机数算法比较[参考].pdf

    2. **桶排序法**:创建一个大小为m的数组,每个位置代表一个随机数,通过随机数的索引将这些数放入对应的桶中,最后遍历桶得到不重复的随机数。 3. **布隆过滤器**:使用布隆过滤器检查生成的随机数是否已存在,避免...

    choujiang-1.0.tar.zip_抽奖

    开发者可能会定义一个数组来存储参与者的信息,然后通过循环遍历数组,用随机数选取幸运儿。此外,为了保证公平性,程序可能还会加入一些逻辑,比如避免重复抽中同一个号码,或者设定每个参与者被抽中的概率。 在...

    JAVA 抽奖算法,JAVA 抽奖算法·

    该JAVA抽奖算法通过合理的概率缩放、累积概率计算以及随机数生成与比较等步骤,实现了基于不同概率分布的灵活抽奖功能。对于实际应用场景来说,这种算法不仅简单高效,而且易于扩展,能够满足多种不同的需求。

Global site tag (gtag.js) - Google Analytics