`
kangfuq
  • 浏览: 12141 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

生成不重复的随机整数算法分析

阅读更多

 

算法一:
        用一个List保存所有候选的整数,依次 生成一个随机索引(该索引的范围需要递减),返回该元素,并移除该索引对应的元素值。缺点 :该算法经测试大概1M 的整数范围需要用到约16M 的内存空间,所以对于 大数据范围,多线程且每个线程分别独立生成不重复的随机整数 的情况下不太适用。 优点 :该算法的可读性最强;而且因为会移除返回的元素,所以占用的内存会动态逐渐减少。)
所以此处没有给出代码示例。
 
算法二:
        用一个数组保存所有候选的整数,依次 生成一个随机索引(该索引的范围需要递减),返回该元素,并 将末尾元素赋值到索引位置 且将原末尾元素位置前一个元素作为新的末尾元素。缺点 :可读性比上面的算法弱一点;占用内存一直不变。 优点 :该算法经测试大概 1M 的整数范围需要用到约 4M 的内存空间(因为一个int数据占用4个Byte),比上面的算法好一点;时间复杂度比较低。)
代码示例:
package com.kangfuqiang.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <pre> 
 * Title:不重复的随机整数类
 * Description: 用于依次获取 [MIN,MAX] 范围内的不重复随机整数;
 * 使用说明:需要new一个该类的实例(传入min和max参数),然后 使用该实例 依次获得不重复的随机整数;
 * 
 * ps:1M 的整数范围时,该实例占用的相关内存约为 4M 。
 * 
 * </pre>
 */
public class NoRepeatRandomInt {
    private static Logger log = LoggerFactory.getLogger(NoRepeatRandomInt.class);
    
    /** 最小值(包含) */
    public final int MIN;
    /** 最大值(包含) */
    public final int MAX;
    
    
    /** 计数器,记录已经领取不重复的随机整数的次数 */
    private int counter = 0;
    
    /** 保存 [MIN,MAX] 范围内的所有整数*/
    private int[] numArr ;   
    
    /**
     * @param min
     * @param max
     * @exception IllegalArgumentException 如果 min > max,则抛出该异常
     */
    public NoRepeatRandomInt(int min, int max) {
        if(min>max){
            String str = String.format("构造器参数错误,最小值不能大于最大值!min:%s,max:%s", min, max);
            log.error(str);
            throw new IllegalArgumentException( str );
        }
        this.MIN = min;
        this.MAX = max;
        numArr = new int[this.getOriginalCnt()];
        for(int i=0; i<numArr.length; i++){
            numArr[i] = i + this.MIN;
        }
    }
    
    /**
     * 领取 下一个不重复的随机整数
     * @return
     * @exception RuntimeException 如果 领取次数 超过 总个数范围,将抛出运行时异常
     */
    public int next(){
        if(this.getRemainCnt()<=0){
            String str = String.format("领取次数 超过 总个数范围(%d个)!", this.getOriginalCnt());
            log.error(str);
            throw new RuntimeException(str);
        }
        int idx = (int)(Math.random() * this.getRemainCnt());
        int ret = numArr[idx];
        numArr[idx] = numArr[this.getRemainCnt()-1];
        numArr[this.getRemainCnt()-1] = ret; 
        this.counter++;
        return ret;
    }
    
    /** 获得原始个数 */
    private int getOriginalCnt(){
        return this.MAX - this.MIN + 1;
    }
    
    /** 获得剩余个数 */
    private int getRemainCnt(){
        return this.MAX - this.MIN + 1 - counter;
    }
}
  
 
算法三:
        使用Set集合来保证或保存不重复的随机整数。 这种算法适合 (返回数目/ 范围数目)的值非常小 的情况, 其他情况还是使用上面的两种算法比较好。
 
PS:
网上还有一些其他的算法,但是大多时间复杂度比较高,空间复杂度也没有明显的好处。
1、遍历 已返回的随机数 的集合,以保证不重复随机整数。
2、初始化List后,随机排序一下(shuffle),然后依次返回。
3、初始化数组后,数组随机调换位置,然后依次返回。
 
欢迎大家交流、指点、评论与回复
1
3
分享到:
评论

相关推荐

    随机整数生成器

    随机整数生成器是一种在计算机程序中常用的工具,它能够按照特定规则产生一系列随机的整数值。...无论是游戏中的角色位置生成,还是数据分析中的抽样,甚至是网络安全中的加密解密,都离不开随机整数的生成。

    java 随机生成整数

    本文详细分析了如何使用Java生成1至100之间的随机整数,并特别聚焦于识别和输出那些连续出现次数超过指定次数的数字序列。通过理解代码中的随机数生成、避免重复数字以及条件输出机制,开发者可以更好地掌握Java中的...

    产生不重复随机数算法

    在IT领域,尤其是在软件开发与算法设计中,生成不重复的随机数是一个常见的需求,尤其在游戏、数据安全、统计抽样以及教育软件中的随机组题等场景下尤为重要。本文将深入探讨一种在Java中实现的高效算法,该算法能够...

    算法与数据结构设计 指定类型数据随机生成算法

    在“去重复数据”这一需求中,我们需要确保生成的随机数据不重复。一种常见的方法是使用容器(如std::set或std::unordered_set)来存储已经生成过的数据,并在生成新数据时检查新数据是否已存在。如果不存在,则添加...

    易语言取不重复随机数

    在易语言中,生成不重复随机数是一项常见的需求,特别是在游戏开发、数据分析或者算法设计等场景。本文将深入探讨如何在易语言中实现取不重复随机数的功能。 首先,我们需要了解易语言中的随机数生成函数。在易语言...

    JS生成不重复随机数组的函数代码

    在生成不重复随机数组的逻辑中,`tmp`数组是利用循环和递增的变量`i`构建的,该循环利用了闭合范围`s 来确保不遗漏任何数值。 最后,代码中的`var l = tmp.length;`这行代码是为了获取`tmp`数组的长度,之后`l`会...

    产生30个介于0至50之间的不同的随机数(VB)

    本程序旨在利用Visual Basic(简称VB)编写一段代码,用于生成30个介于0到50之间且各不相同的随机整数,并将这些数字进行排序后输出。 **二、核心概念与技术** 1. **随机数生成**:在编程中,随机数生成是一种常用...

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

    此外,对于生成m个不重复的随机数,可以采用以下几种算法: 1. **排序法**:生成m个随机数,然后对它们进行排序,去除重复的数字。 2. **桶排序法**:创建一个大小为m的数组,每个位置代表一个随机数,通过随机数的...

    随机生成11位数字

    根据给定的信息,我们可以深入探讨如何在编程环境中生成指定...通过以上分析和改进,我们不仅能够准确地生成所需的11位随机数字串,还确保了代码的高效性和适用性。这对于IT行业的开发人员来说是非常有价值的技能之一。

    随机选不重复号程序

    在这个特定的情况下,我们讨论的是一个名为"随机选不重复号程序"的项目。这个程序的主要功能是生成随机号码或者名字,同时确保每次选取的号码或名字都是独一无二的,避免重复。这种功能在抽奖、分组、竞赛编号分配等...

    快速生成特定区间内的不重复随机数(随机打乱区间元素顺序)

    在编程领域,生成特定区间内的不重复随机数是一项常见的任务,尤其在模拟、游戏开发、数据分析等场景中。本文将详细探讨如何通过移位和逻辑运算实现这一目标,以达到高效且准确的效果。 首先,我们要明确一点:生成...

    随机数生成算法,数值算法

    在描述的场景中,我们关注的是生成0到32767之间的一个随机整数。 随机数生成器通常分为两大类:伪随机数生成器(PRNG)和真正随机数生成器(TRNG)。伪随机数生成器是基于数学公式或特定序列的算法,它们可以快速...

    C#产生不重复的随机数

    在IT领域,尤其是在编程语言C#中,生成不重复的随机数是一个常见且重要的需求,尤其是在游戏开发、安全系统、数据分析等应用场景中。本文将基于提供的文件内容,深入解析三种不同的方法来实现这一功能,旨在为读者...

    伪随机数生成算法及比较

    本文主要探讨了几种常用的伪随机数生成算法,并对它们进行了比较分析。 #### 二、伪随机数生成算法 ##### 1. 取中法 取中法是一种早期的伪随机数生成方法,其中包括平方取中法和乘积取中法。 - **平方取中法**:...

    易语言源码易语言取不重复随机数.rar

    该命令可以生成一个指定范围内的随机整数。例如,如果我们想生成0到99之间的随机数,可以使用以下代码: ```易语言 .随机数发生器 (0, 99) ``` 然而,这并不能确保生成的随机数不重复。当我们需要一个序列的不重复...

    MIT 算法分析讲义

    ### MIT算法分析讲义知识点概览 #### 一、引言 《MIT算法分析讲义》是一套由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest 和 Clifford Stein编写的权威教材《算法导论(第二版)》的配套教学资料。这...

    算法设计与分析期末考试试卷与答案

    2. **算法分析**: - **时间复杂度与空间复杂度**:衡量算法效率的关键指标,分别表示执行时间和所需内存。理解并计算这些复杂度有助于优化算法。 - **渐进分析**:主项分析、高阶项分析和同数量级分析,用于描述...

    0-99的不重复随机数

    在编程领域,生成0到99之间不重复的...通过以上分析,我们可以看到,生成0-99的不重复随机数虽然看似简单,但背后涉及到了随机数生成、数据结构、算法以及错误处理等多个编程知识点,这些都对提升编程能力大有裨益。

    产生规定范围内的Excel随机数.rar

    例如,`=RAND()*(100-1)+1` 将生成1到100之间的随机整数。 然而,仅使用RAND函数无法保证生成的数字不重复。为确保生成的随机数不重复,我们可以结合其他Excel功能,如INDEX和MATCH函数,或者使用排序和去重的技巧...

    随机数字生成器

    无论是在加密算法、模拟实验、游戏编程还是数据分析中,我们都需要能够生成不可预测且均匀分布的随机数。本文将深入探讨随机数字生成器的基本原理、类型以及在实际应用中的实现。 首先,我们需要理解随机数生成的两...

Global site tag (gtag.js) - Google Analytics