`
dingjob
  • 浏览: 183299 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

随机数组合,随机号码产生器

阅读更多
public class RandomUtil {

    private static Random random = new Random();


    public static String getRandomNumber(String[] range,int rangeLength,int length){
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<length;i++){
            sb.append(String.valueOf(range[random.nextInt(rangeLength)]));
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        String[] range = {"0","1","2","3","4","5","6","7","8","9"};
        System.out.println(getRandomNumber(range, 10, 8));

    }
}

 运行结果:

91373770

 以上是最简单的随机数产生,不排除产生相同随机数的可能性。如果投入使用,需要加上一个过滤器,将重复数据进行过滤,真实应用中,你会发现8位数据产生到50多W的时候就会经常性发生重复数据。

 

 

 

二. 那么如何产生唯一的随机数呢,参考如下代码:

 

public class GUIDUtil 
{
    /* 随机种子 */
	private static char x36s[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
	/* 随机数长度 */
	private static short len = 20;
	
	public static String newId() 
	{
		char chs[] = new char[len];
		
		/**
		 * 生成前8位随机字符(以系统时间为随机池, 以36位数字+英文字母为随机种子)
		 */
		System.out.println(System.currentTimeMillis()-936748800000L);
		long v = (System.currentTimeMillis()-936748800000L)>>1;	//1999-9-9 开始,起码要横跨102年:)
		for(int i=7; i>0; i--)
		{
			chs[i] = x36s[(int)(v%36)];
			v = v/36;
		}
		chs[0] = x36s[(int)(v%26) + 10]; //确保第一个随机字符是"字母", 以符合一般编程的标识符定义

		/**
		 * 生成后12位随机字符(以UUID为随机池, 以36位数字+英文字母为随机种子)
		 */
		UUID u = UUID.randomUUID();
		v = u.getLeastSignificantBits()^u.getMostSignificantBits();
		System.out.println(v);
		if(v < 0)
		{
			v = -v;
		}

		for(int i=8; i<len; i++)
		{
			chs[i] = x36s[(int)(v%36)];
			v = v/36;
		}
		
		return new String(chs);
	}
}

 如上部分采用了比较通用的UUID标准产生算法。在产生时尽量通过jvm的与或和移位操作,保证了JVM的高效执行,这些操作在新的JVM里面是可以直接运算的,不需要其它步骤。甚至hashCode计算时使用的*31在新的JVM里面也可以转换成移位操作的。(这是题外话)

通过时间戳+UUID最高位和最低位异或的方式获得,能保证近似唯一ID的获得。

三.如上的方法真的能保证唯一ID吗?

 

答案是否定的,影响ID产生的无非是MAC地址+时间戳+随机数 。在分布式应用中,同一台机器也可能在同一时间被不同的应用访问,数据量很大时,很有可能产生相同的ID,并且使用JAVA的guid效率并不高。这里可以通过用一台server机器来预先生成唯一ID,这个是批量生成的。然后供应用去取。

如下:

 



 

 

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

相关推荐

    计算统计学课程作业30种随机数发生器(组合随机数发生器)matlab代码

    本课程作业聚焦于30种不同的随机数发生器,其中包括5种基础的随机数发生器及其两两组合形成的25种组合随机数发生器。所有这些实现均采用MATLAB编程语言,这是一款广泛应用于科学计算的软件。 首先,我们来探讨...

    Keil C51 中产生随机数的方法

    在Keil C51开发环境中,生成随机数是嵌入式系统编程中常见的需求,尤其在游戏、加密算法、测试...为了提高随机性的质量,可以考虑使用硬件时钟等物理量作为种子来源,从而避免每次程序运行时都产生相同的随机数序列。

    Winform-随机数生成器

    对于生成随机序列号,可能需要包含字母和数字的组合,这可以通过扩展`Random`类或者使用`Guid`类来实现。例如,创建一个包含数字和字母的10位随机字符串: ```csharp public static string GenerateRandomString...

    用c语言产生随机数

    综上所述,在C语言编程中,虽然不能生成真正的随机数,但可以利用rand()和srand()函数的组合产生满足各种需求的伪随机数。为了提高随机数序列的不可预测性,应当使用基于当前时间的种子值。此外,编写通用的随机数...

    excel中批量设置随机数

    默认情况下,Excel提供的RAND()函数会生成0到1之间的随机浮点数,每次打开工作簿时,这个函数都会重新计算,产生新的随机数。然而,这并不符合某些场景下对稳定随机数的需求。这时,我们可以借助VBA(Visual Basic ...

    在一个时间点 生成多个随机数 生成N组长度固定的随机下标组合

    总之,C#提供的`Random`类是生成随机数的核心工具,结合数组、集合等数据结构,我们可以灵活地生成各种随机数组合,以满足各种应用场景,如本例中的试卷随机排序。这种能力在开发游戏中创建随机事件、模拟实验、测试...

    e语言-随机生成字母数字组合例程

    首先,程序会利用内置或自定义的随机数生成器来产生一系列随机整数。这些整数通常介于0和某种限制之间,例如0到62(对应26个小写字母、26个大写字母和10个数字)。然后,每个随机数会被映射到相应的字母或数字上,...

    计算统计学课程作业30种随机数发生器(组合随机数发生器)matlab代码.zip

    这些生成器能够产生看似随机但实际上可预测的数字序列,对于测试假设、构建模型以及进行各种统计计算至关重要。MATLAB是一种广泛用于数学计算和数据分析的高级编程环境,其内置了多种随机数生成器。这份"计算统计学...

    matlab开发-拉普拉斯随机数发生器

    通常,MATLAB的标准库并不直接提供拉普拉斯分布的随机数生成,但可以通过组合其他函数实现,如`randn`(产生标准正态分布的随机数)和`exp`(指数函数)。 下面是一个可能的`laprnd.m` 函数实现: ```matlab ...

    随机数相关标准SP800-90A

    为了验证随机数生成器产生的随机序列的质量,NIST还规定了一系列测试方法。这些测试包括但不限于: - **频率测试**:评估随机比特序列中0和1的出现频率是否接近相等。 - **串长测试**:检查随机序列中连续相同数字...

    随机数c代码

    描述中的"产生随机数的一段c代码"可能涵盖了自定义随机数生成器的实现,或者对标准库函数的扩展。从提供的文件名来看,这些文件可能是不同类型的随机数生成算法的实现: 1. **sfmt.cpp** 和 **sfmt.h**:SFMT(SIMD...

    C语言产生随机数的代码

    在C语言中,`rand()` 函数用于生成伪随机数序列,而 `srand()` 函数则用于设置随机数生成器的种子值。这两个函数通常结合使用来生成一系列的随机数。 - **`rand()`**: 此函数返回一个介于0到`RAND_MAX`之间的整数。...

    VC 产生随机数

    在这个MFC示例中,`CRandom`类的`Randomize`方法用于初始化随机数生成器,`Range`方法则用于生成指定范围内的随机整数。 如果你需要在程序中多次生成随机数,通常会把随机数引擎的实例作为全局变量或成员变量来保存...

    混合同余法产生均匀分布随机数产生方法总结

    2. **随机数的唯一性**:在一个周期内,混合同余法产生的随机序列中的任意两个随机数不可能完全相同,这一点在某些应用场景下可能不符合实际情况。 3. **最大周期条件**:Hull和Dobell证明了混合同余法能够实现最大...

    生成随机数算法

    例如,可以将多个`rand()`的结果组合起来,或者使用其他随机数生成器如Mersenne Twister。 接口的设计是为了提供一种简洁的调用方式,让其他部分的代码可以方便地使用随机数生成功能,而不必关心具体的实现细节。在...

    易语言取随机数原理模块

    在计算机中,由于硬件限制,真正的随机数是无法生成的,因此通常使用伪随机数生成器(Pseudo-Random Number Generator, PRNG)。这些生成器根据一个初始值(称为种子)生成一系列看似随机的数字序列,但其实这个序列...

    如何快速产生指定区间内的随机数

    真随机数依赖于物理过程生成,而伪随机数则是通过数学运算产生的一系列数值,这些数值看起来是随机的,但实际上是由一个确定性的算法产生的。 在本示例中,使用的是C++语言中的伪随机数生成方法。 ### 2. C++中的...

    randm_randm_Verilog产生伪随机数模块_

    "randm_randm_Verilog产生伪随机数模块"就是一个这样的设计实例,它旨在创建一个8位的伪随机数发生器。 伪随机数生成器(PRNG)并不像真正的随机数那样具有完全不可预测性,而是通过数学算法生成一系列看起来随机但...

Global site tag (gtag.js) - Google Analytics