`
dingjob
  • 浏览: 181338 次
  • 性别: 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
分享到:
评论

相关推荐

    随机数频数_游程检验

    随机数检验是对利用...经验检验是一种统计检验,根据来自某分布总体的简单随机样本的性质,如特征值、均匀性、随机性和组合规律性等,研究随机数生成器产生的随机数列的相应性质,进行比较、鉴别,确定其差异程度。

    matlab平方取中法、线性同余法、组合发生器生成三种伪随机数

    matlab平方取中法、线性同余法、组合发生器生成三种伪随机数,并进行均匀性检验

    随机数字生成器,可指定产生多少个数字于字母

    随机数字生成器,可产生数字和字母,可指定产生多少个数字于字母

    rautanoppa:FPGA 的硬件随机数发生器

    使用足够数量的自然抖动时,自然抖动会产生通过 FIPS 140-2 测试的随机比特流,如 rng-tools 中所用。 比特流通过 RS-232 串口输出。 串行端口 (UART) 代码逐字改编自 。 可以使用 USB 串行适配器和/或 TTL 电平...

    动态分组混沌伪随机数发生器

    为了克服计算机处理数据的有限精度导致混沌特性退化的缺陷,改善随机数发生器输出序列的随机性能,设计了一种新的基于logistic混沌映射生成伪随机数的方法。在提出的方法中,采用四个一维logistic混沌映射,每次迭代...

    密码学课程设计-电子邮件保密系统的设计与实现(源码+报告).zip

    PGP不是一种完全的非对称加密体系,它是个混合加密算法,它是由一个对称加密算法(IDEA)、一个非对称加密算法(RSA)、一个单向散列算法以及-一个随机数产生器(从用户击键频率产生伪随机数序列的种子)组成的。...

    数字信号处理c语言程序集

    1.15含有高斯白噪声的正弦组合信号的产生 1.16解析信号的产生 1.1离散傅立叶变换 第一章 快速傅立叶变换 1.2快速傅立叶变换 1.3基4快速傅立叶变换 1.4分裂基快速傅立叶变换 1.5实序列快速傅立叶变换(一) ...

    风靡一时的2048小游戏再现江湖,设计资料开源,开战啦!-电路方案

    随机数产生器为随机产生模块gen服务。随机数生成器产生3组随机数,分别为8bit,12bit和16bit。分别对应2空格、3空格和4空格的情况。例如,如果右移后的图片如下图所示,那么黄色格子里的2就是在最左列3空格情况下...

    Content-generator-sketch-plugin:Sketch app插件,用于生成虚拟数据,例如头像,名称,照片,地理数据等

    演示版生成图片产生名字生成伪文本产生字串 您可以通过组合以下任意选项来创建自定义字符串: 纯文本(例如:香蕉) 范围内的随机数(例如:[0-20]) 数组中的随机项(例如:[banana〜apple〜grapes]) 组合字符串的...

    C语言通用范例开发金典.part2.rar

    资源简介 第1章 数据结构. 1 1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 ...2.1.6 求反正切 ...

    C语言通用范例开发金典.part1.rar

    第1章 数据结构. 1 1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 ...

    C 开发金典

    配书光盘Readme文件 C 语言通用范例开发金典 第1章 数据结构. 1 1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 ...2.1.2 求浮点数的...

    LINGO软件的学习

    LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 §1 LINGO快速入门 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: ...

    c# 加密和解密相关代码

    开发程序时,经常需要判断输入的字符串是否为数字,如判断输入的电话号码、货币金额和邮编等。在程 序中判断是否为数字的方法有很多种,可以使用正则表达式、int.Parse 方法和double.Parse 方法等。下面的代码 通过...

    精易模块[源码] V5.15

    6、优化“文本_取随机数字”精简代码,提高执行效率,感谢易友[ds9660]反馈。 7、修正“普通填表-&gt;链接_点击”无法在本窗口中打开的BUG,感谢易友[@zhuan888]反馈。 8、修正“时间_时间戳转文本”代码不严谨出现数组...

    Java开发技术大全(500个源代码).

    outputByWhile.java 用do~while循环随机输出数据 outputMax.java 求两个数中的最大数 overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ...

    delphi 开发经验技巧宝典源码

    0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位或超过8位 150 0228 如何获取汉字拼音简码 151 0229 根据用户输入需求自动调整输入法 152 0230 根据生日自动计算年龄 ...

Global site tag (gtag.js) - Google Analytics