生成1亿个不重复的8位随机整数

原创 2013年10月12日 15:46:46
项目中有一部分需要用到8位不重复的随机整数,即有1到99999999种可能,即1亿个可能。这可是一个不小的数据量。那要怎么去实现呢?


1、尝试使用Access
在看到这个需求时,第一反应就是使用数据库。但是客户又要求不能使用SQL等数据库,于是又换了个思路,既然不能使用SQL,那使用Access来替换


不就可以了吗?
于是想着在程序中产生随机数,并将其与数据库中已经使用的随机数进行比对,如果不存在,则使用该随机数,并且插入到数据库中。基于这个想法


,做了个简单的测试。当数据量达到百万级时,运行速度明显变量,当达到千万级时,更是慢之又慢,而项目中随机数的使用频率,最快时一秒中可在达到5到8个,这明显满足不了需求。
再网上查了下资料,有说到当Access达到64M时,效率会明显降低,而1亿个随机数,按8个字节一个也有760几M,虽然可以通过设置,将Access设置到2G,但效率低了,无法满足要求。
使用Access的尝试失败。


2、尝试使用SQL
在使用Access测试时,发现CPU和内存的消耗居高不下,于是就想着这应该是频繁的查找和插入造成的,如果可以避开这一步,那是不是就能提高效率了呢?有了这个思路,又遇到新的问题。那如果不在程序中动态生成随机数,不就得预先生成一个随机数的字典,然后不断的去读取吗?那这个随机数的字典要如何去产生呢?这时想到了SQL。

虽然项目中提到不能使用SQL,但是可以通过SQL插入ID和随机码,其中ID采用GUID,随机码是1到99999999的数,然后将表格按GUID排序,这样就生成了随机数表。之后再导出为并进一步处理为所要的字典。写了一段SQL,代码如下

DECLARE @randomCode int
SET @randomCode=1
WHILE @randomCode<=99999999
	BEGIN
		INSERT INTO RandomCodeDictionary(ID,RandomCode) VALUES(NEWID(),CAST())
		SET @randomCode=@randomCode+1
	END

结果这段SQL跑了一晚上,也没有跑完。电脑配置是WIN7_64、4G内存、奔腾CPU主频2.7。显然这条路也不通。


3、尝试程序直接生成

前面两次尝试都失败了,那就只剩下自己写程序来生成随机字典了。但又碰到了一个问题,这8位随机整数该以什么形式存储呢?如果是直接以整数的形式,那么每个整数只需要4个字节,而以字符的形式储存,8位就得8个字节,显然以整数储存会节省一半的空间,但是这样一来就限定了这8位随机数必须是整数,万一哪一天客户需要变了,要换成包含字母和符号的随机数,那就完蛋了。思来想去,最后决定增加其扩展性,牺牲一点储存空间。具体代码如下

private void generate(string savePath)
        {
            int begin = 1;
            int end = 9999;
            Encoding encoding = Encoding.UTF8;
            FileStream destStream = new FileStream(savePath,FileMode.Create,FileAccess.ReadWrite,FileShare.None);
            List<byte[]> codeList = new List<byte[]>();
            for (int i = begin; i <= end; i++)
            {               
                string code = string.Format("{0:00000000}", i);
                byte[] codeBytes = encoding.GetBytes(code);
                codeList.Add(codeBytes);                
            }
            while (codeList.Count>0)
            {
                int index = generateRandomInt(0, codeList.Count);
                byte[] tempCodeByte = codeList[index];
                codeList.RemoveAt(index);
                destStream.Write(tempCodeByte, 0, 8);
            }
            destStream.Close();
        }
 private int generateRandomInt(int min, int max)
        {
            Random random = new Random(Guid.NewGuid().GetHashCode());
            int randomInt = random.Next(min, max);
            return randomInt;
        }

随机字典很顺利的生成了,但这时只是1到9999。于是将end调大,依次是5个9、6个9、7个9、8个9,当到达8个9时,程序已经跑不动了。显然这样的做法也不行。于是又绞尽脑汁的想,终于有了新的思路,具体的请参见亿级数据时,内存性能低于IO性能一文。

至此,终于达成了目的。

转载请注明出处http://blog.csdn.net/xxdddail/article/details/12652385

版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA 生成无重复8位随机码

原创:http://blog.csdn.net/andy_miao858/article/details/9530245 短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过...
  • Susan8888
  • Susan8888
  • 2016年10月21日 11:16
  • 4423

java随机生成6/8/12位数,要求每次产生的随机数与已生成的随机数不重复

备注:如果有相同的数据,那么就重新生成一个新的数据: 后台代码如下: public static void main(String[] args) { String cardNumber=re...
  • xuanzhangran
  • xuanzhangran
  • 2017年02月23日 15:07
  • 1828

生成8位随机不重复的数字编号

package com.jjinfo.common.util; import java.util.Arrays; import java.util.Random; ...
  • johnjobs
  • johnjobs
  • 2013年09月10日 12:14
  • 1964

Java 生成任意位数永不重复的随机数策略实现

在项目中遇到客户一个需求,ID的生成策略:长度8位,用户在知道自己的ID(如:10000018)后,不能通过ID来推测相关信息,如用户可能推测我是第18个注册用户,上一个注册用户的ID是1000001...
  • qq_35619711
  • qq_35619711
  • 2017年05月08日 23:59
  • 3092

JAVA生成短8位UUID

短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个。 本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUI...
  • andy_miao858
  • andy_miao858
  • 2013年07月27日 15:39
  • 38403

uuid生成12位随机数 不重复

for (int i = 0; i String s = UUID.randomUUID().toString(); s =  s.substring(0,8)+s.substring(9,13...
  • guorun18
  • guorun18
  • 2015年08月24日 18:52
  • 7092

生成UUId或随机数字

package com.*.util.generator; import java.util.UUID; public class UUIDGenerator { p...
  • brian_9988
  • brian_9988
  • 2014年02月12日 14:30
  • 8702

UUID生成随机编号(适用于数字字母混编)

UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,...
  • gundumw100
  • gundumw100
  • 2017年04月10日 17:57
  • 435

如何快速生成100万不重复的8位编号

最近在论坛看到有人问,如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的:1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小2.    控制不重复3.    考虑...
  • zjcxc
  • zjcxc
  • 2006年08月20日 11:28
  • 20850

利用时间生成8位不重复数

  • 2015年06月15日 09:38
  • 43KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:生成1亿个不重复的8位随机整数
举报原因:
原因补充:

(最多只允许输入30个字)